消息队列之 RabbitMQ
(运维篇)MySQL CRON 定时全量备份
(五)ElasticSearch 分片深入研究
Prometheus + Grafana 打造实时全链路监控系统
序言
人非圣贤,孰能无过?
对程序而言,同样如此,即使一个产品经历了一系列的开发测试工作,在此过程中又遇到并解决了成百上千个 Bug,最终交付给客户并正式上线了,后期还是可能会出现一些问题。
这些问题的产生,可能是客户进行了不符合逻辑的异常操作引起的,也可能是程序代码原先判断逻辑本就存在问题,还有可能是某个应用或服务器资源(CPU、内存、磁盘、网络)出现异常了。但不管怎样,是问题就应当给客户解决,不然客户不满意了,公司的企业形象降低了,若后期还有合作,说不定就泡汤了呢!合作泡汤了,说不定整个业务部门就给你优化掉,程序员就没班上了呢!!!
作为程序员,为了防止被优化的意外发生,还是老老实实的帮客户解决问题吧!
那么,怎么去解决问题呢?
作为一个程序员,接到一个产品问题,想的应该不是解决,而是分析问题的类型,待分析出问题的类型后,才去解决问题。
那么,问题大概又可以分为哪几种类型呢?
笔者认为,其大致可以分为以下三种:
- ① 理解问题:做的需求不符合客户的预期效果,客户不买帐,那么,互相扯皮或者重新做~
- ② 代码问题:程序存在 Bug,这又进一步可以分为三种:
- 前端 Bug:前端程序问题,页面设计不合理或与后端对接不正确
- 后端 Bug:后端程有问题,逻辑错误或重大 Bug 导致应用的宕机,那么让后端同学修复
- 运维 Bug:服务器配置问题,让实施同学(通常被后端同学替代…)解决
- ③ 服务器问题:CPU、内存、磁盘,网络资源引起的问题
现在,我们得到了一个结论——问题的存在形式是多种多样的,因此我们遇到问题不能局限在某一块思考(后端开发不能碰到问题就想的是看日志,得明确是后端问题才去看日志),因为不同的问题解决方案也不一样。
由于只有在大致分析出问题的类型后,才能尝试去解决问题:
- 针对问题 ①,我们有时可以甩锅给产品同学——你的需求不对呀,我肯定做错呀(叉腰:理直气壮),当然有时也需要自己接锅(自己理解不到位)
- 针对问题 ②,通常需要看线上日志来定位问题的产生原因,尝试复现 Bug
- 针对问题 ③,需要去看服务器某段运行时间里资源情况(注意哦,是观测服务器在某段运行时间里资源情况,因为线上出问题了,肯定是之前某个时间点出的问题,我们仅仅观察出错后的资源占比情况不一定能找出问题所在)
那么,又该如何去观察服务器在某段运行时间里的资源情况是怎样的呢?
这个时候,就需要布置一套监控系统来辅助我们程序员观察分析了。
Java 高并发之工具类
序言
针对并发场景,Java 提供了众多的并发工具类供我们使用,可以按照具体的业务场景选择合适的工具类:
| 工具类 | 核心解决的问题 | 典型业务场景 | 关键词 |
|---|---|---|---|
CountDownLatch |
等多个任务完成继续执行 | 主线程等待多个子任务完成 | 等完成 |
CyclicBarrier |
多个线程互相等待,到齐后一起继续 | 多线程分阶段计算 | 等大家 |
Semaphore |
控制同时访问资源的线程数量 | 限流、连接池、库存资源控制 | 限并发 |
Lock / Condition |
更灵活的线程同步与等待 | 队列、生产者消费者 | 锁 |
Atomic 等 |
无锁线程安全地更新变量 | 计数器、状态更新 | 原子操作 |
CompletableFuture |
异步任务编排 | 并行查询、任务组合、异步回调 | 异步编排 |
BlockingQueue |
线程安全的生产消费队列 | 任务队列、线程池内部队列 | 生产消费 |