这是一个创建于 3234 天前的主题,其中的信息可能已经有所发展或是发生改变。
场景:具有优先级设置的消息系统,目前准备基于 kafka 实现。
希望实现:
1. 多进程的统一管理调度
2. 保证优先级高的消息,优先处理
3. 保证优先级低的消息,不会因为优先级高的消息处理失败而堵塞
======================================
一个不太优的方案:
1. 将不同的消息类型定义为主题,具有优先级(1-10)属性。
2. 配置最大处理进程数
启动进程(主进程)获取到所有定义的主题,按照优先级生成不同的监听进程。
生成一个进程监控 1 个优先级为 1 的主题
生成一个进程监控 2 个优先级为 2 的主题
。。。
生成一个进程监控 10 个优先级为 10 的主题
当优先级低于 3 的监控进程,没有消息处理的时间超过一定阈值(按照优先级设定),就通知主进程过一定时间后重启。
缺点:
当优先级高的消息处理时,进程数没有到达最大处理进程数的时候,也不会开启进程处理
当主题变多的时候,需要进程数也变多,很容易造成瓶颈。
=========================================
作为 phper 接触到进程管理的概念也比较少,希望有同学能指点一下~~
3 条回复 • 2016-04-11 21:24:19 +08:00
![Zuckonit](https://cdn.v2ex.com/avatar/8aaf/ebe1/27783_normal.png?m=1349662453) |
|
1
Zuckonit 2016-04-11 13:23:01 +08:00
每次进程取数的时候可以选个随机数决定取那个队列,保证选择到的随机数概率和优先级成正比就 ok 了,把优先级转化为概率问题。比如 从数组[1,1,1,1,1,1,1,2,2,2,2,3,3,3]里面选到 1 的概率大一些
|
![xujif](https://cdn.v2ex.com/avatar/e2d4/b191/82876_normal.png?m=1437964304) |
|
2
xujif 2016-04-11 14:11:18 +08:00
遍历一次队列,选取优先级最高的处理,然后剩下的优先级+1 ,入队优先级根据需要设置
|
![ynztyl10](https://cdn.v2ex.com/gravatar/c3a5b835bce2acf6c308e5f9dddd6335?s=48&d=retro) |
|
3
ynztyl10 2016-04-11 21:24:19 +08:00
可参考 linux 的 IO 调度算法
|