1, 任务调度问题问题。
任务调度会遇到下面的坑:
1.1,任务丢失。
业务中出现过几种任务丢失的情况。第一种,使用不熟悉的队列rabbitmq,使用不熟悉的连接池,没使用ack,io太高后出现废弃连接,任务丢失。第二种,使用队列自带超时,最后由队列推断在队列阶段丢弃了任务。
1.2,任务校验:入口参数校验,获取文件大小校验,上传文件大小校验。分布式系统都是不可靠的。被坑过几次。
1.3,任务状态的变更。
1.4,持久化/削峰。对于多阶段任务,需要持久化,避开跨部门或者跨小组沟通,同时方便任务重新导入。
1.5,任务重发。注意去重和哈希。
1.6,任务优先级问题。
3,批量io。注意io 合并,使用多级buff,尽量少io。
4,http parse 导致cpu 太高。在高频请求的时候,解析http 请求时,尽量使用c 库封装的库。
5,三线机器问题,注意两个点,一个是出口ip bind,一个是查询dns 的时候bind ip。
6, 日志太多,适当控制。分级别log ,能明显提高性能。
7,高并发的日志,要带上阶段 和taskid,便于查问题。多线程或者多协程,日志不带id,或者日志位置不对的,都是白打的日志,你都不知道是哪个任务生成的。
8,连接池的单例共享。
9, 全局catch,防止全局崩溃。
10,优雅退出。一般捕捉信号,循环位标记,然后退出。
11,内存queue的去重问题。定时器重新推任务到队列前,应该看下set中是否有这个任务了。
12,队列饿死。重cpu任务,导致cpu打满,上下文不能切换,队列之间出现某些队列始终不消费的情况。
13,原子计数问题。
14,阻塞还是非阻塞获取任务的问题。
15,业务异常的监控。对错误日志,队列等敏感信息监控。