ARTS的初衷
Algorithm: 主要是为了编程训练和学习。
Review:主要是为了学习英文
Tip:主要是为了总结和归纳在日常工作中所遇到的知识点。学习至少一个技术技巧。在工作中遇到的问题,踩过的坑,学习的点滴知识。
Share:主要是为了建立影响力,能够输出价值观。分享一篇有观点和思考的技术文章
https://www.zhihu.com/question/301150832
一、Algorithm
Top K Frequent Elements
Given a non-empty array of integers, return the k most frequent elements.
Example 1:
Input: nums = [1,1,1,2,2,3], k = 2 Output: [1,2] Example 2:
Input: nums = [1], k = 1 Output: [1] Note:
You may assume k is always valid, 1 ≤ k ≤ number of unique elements. Your algorithm’s time complexity must be better than O(n log n), where n is the array’s size.
代码语言:javascript复制class Solution {
public List<Integer> topKFrequent(int[] nums, int k) {
//桶排序,注意:桶长要比原数组长度大一
List[] buckets = new List[nums.length 1];
Map<Integer, Integer> counts = new HashMap<>();
for(int num:nums) {
counts.put(num,counts.getOrDefault(num,0) 1);
}
for (int num:counts.keySet()) {
int count = counts.get(num);
if(buckets[count]==null) {
buckets[count] = new ArrayList();
}
buckets[count].add(num);
}
List<Integer> ans = new ArrayList<>();
//从后往前找top k,i>=1 && ans.size<k
for (int i=buckets.length-1;i>=1 && ans.size()<k;i--) {
if(buckets[i]!=null) {
ans.addAll(buckets[i]);
}
}
return ans;
}
}
二、Review
以前的异常排查不管是通过发临时包、在线调试、QA复现,受多因素的影响,复现排查都麻烦,所以催生了应用性能监控APM。APM是负责监控和管理用户体验的工具,它不像崩溃报告仅仅收集错误信息。主要有两种收集和呈现数据的方式:代码级数据、Metric监控数据。代码级数据就是通过在软件中使用探针和事务跟踪获取到生产信息,这种方式综合性强
确保服务是启动运行状态还远远不够,响应变得缓慢发生的频率远高于程序崩溃,所以需要快速了解清楚问题是如何发生的。APM工具可以帮助开发团队快速了解一些常见问题,比如立即了解任何应用程序问题的根本原因,包括导致问题的确切代码行、方法、数据库或者具体的API调用,又或者了解并比较新版本部署对关键指标的影响,代码变化所引入的新问题和对性能的影响,还有APM可以帮助我们跟踪整体访问和流量高峰情况
APM就是利用数据来理解问题发生的原因,并尽可能提供最佳的用户体验,整个公司团队都从中受益,不管是在部署前、生产,还是部署后阶段。开发团队可以通过APM了解到软件质量,并提供更好的用户体验,测试团队可以通过APM进行压力负载测试并确保整个产品的一致性,运维团队可以通过APM进行性能监控,产品团队可以通过APM获得用户对新功能的欢迎程度反馈,业务负责人可以通过APM跟踪关键业务情况,如果有任何影响到业务增长的问题,他们会在第一时间得到,平均恢复时间MTTR因为性能问题得到更快修复而降低
APM服务收集了相当庞大的数据,但团队需要的是可操作的见解而不仅仅是报告,下面是一些常见的功能
1、完整的堆栈信息
了解清楚到底发生了什么才能更直接有效地处理问题
2、服务监控
基础性能监控CPU使用率、CPU平均负载、内存是必不可少的,依赖服务(如Mysql、Redis、Elasticsearch)调用时延(TP99)监控也很重要
3、事务跟踪
事务跟踪中如何翻译资源ID、记录点击事件是关键,不管采用何种编译插桩技术进行事务跟踪,都要保证自身的低性能消耗,绝不能拖慢服务本身
4、部署跟踪
通过部署跟踪确保所做的更改不会对页面性能产生负面影响,不要等到用户来反馈这些错误
5、数据可视化
走势、分布情况、火焰图等等图表,以更易于理解的格式呈现,也方便我们进行共性分析
6、灵活的告警
基于基线或者阀值的异常检测,然后通过不同渠道反馈到干系人
7、真实用户监控
真实用户监控可以帮助我们了解下面类似问题:用户加载响应差的具体页面是哪个、是什么原因导致了用户的问题、用户遭遇问题前的关键访问路径是什么、整个活动会话访问都是异常的还是个别页面异常、用户设备情况和网络上传下载速度(比如SSL建链首包时间)和LBS定位
8、崩溃报告
无日记信息的异常、只有系统日记的异常、被截断的异常对我们毫无意义,APM需要提供错误前后上下文,完整的方法调用堆栈信息和环境变量
翻译自:
https://medium.com/@raygunio/what-is-application-performance-management-9610315fd63
三、Tip
Kafka无消息丢失配置
1、不要使用producer.send(msg),而要使用producer.send(msg,callback) 2、设置acks = all,表明所有副本Broker都要接收到消息才算已提交 3、设置重试参数retries一个较大的值 4、设置unclean.leader.election.enable=false,避免落后太多的Broker参考leader的竞争 5、设置replication.factor>=3,表明消费保存份数 6、设置min.insync.replicas>1,表明消息至少要被写入到多少个副本才算是已提交 7、确保replication.factor>min.insync.replicas 8、设置enable.auth.commit=false,确保消息消费完成后再提交
作者BLOG:www.liangsonghua.me
作者介绍:京东资深工程师-梁松华,在稳定性保障、敏捷开发、JAVA高级、微服务架构方面有深入的理解