V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
eric_zyh
V2EX  ›  程序员

请教一个关于多进程设计的问题~

  •  
  •   eric_zyh ·
    ericzyh · 2016-04-11 10:26:57 +08:00 · 2597 次点击
    这是一个创建于 3178 天前的主题,其中的信息可能已经有所发展或是发生改变。
    场景:具有优先级设置的消息系统,目前准备基于 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
        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
        2
    xujif  
       2016-04-11 14:11:18 +08:00
    遍历一次队列,选取优先级最高的处理,然后剩下的优先级+1 ,入队优先级根据需要设置
    ynztyl10
        3
    ynztyl10  
       2016-04-11 21:24:19 +08:00
    可参考 linux 的 IO 调度算法
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1477 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 17:10 · PVG 01:10 · LAX 09:10 · JFK 12:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.