V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
darasion
V2EX  ›  程序员

求一个技术解决方案

  •  
  •   darasion · 2013-01-03 16:58:49 +08:00 · 3874 次点击
    这是一个创建于 4350 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我有无数多个任务,根据业务随机产生:
    1. 要保证满足同一特征(比如hash key、id什么的)的任务都在同一个队列中先进先出顺序执行(fifo)。
    2. 没有完成的任务需要持久化保存,也就是说断电或 kill 进程也不能丢任务。
    3. 队列生命周期可能非常长,几年也有可能。


    其他次要需求:
    4. 稳定——不想付出非常多的维护成本。
    5. 接口丰富——至少可以支持 php 、python什么的
    6. 容易配置和使用

    另外,
    尝试过 Gearman ,貌似没法满足第 1 条。
    最好是有开源代码可以借鉴和研究.
    11 条回复    1970-01-01 08:00:00 +08:00
    notedit
        1
    notedit  
       2013-01-03 17:03:55 +08:00
    beanstalkd
    raspberry
        2
    raspberry  
       2013-01-03 17:10:06 +08:00
    不知道你说的任务是什么,如果可以序列化成字符串的话也许可以用redis?
    1.根据同一特征计算key写入List
    2.开AOF模式
    3.可能会受限于内存容量

    主要是最近正在用redis,看到队列什么的就敏感了,不符合勿怪……
    darasion
        3
    darasion  
    OP
       2013-01-03 17:59:12 +08:00
    @notedit 有个问题哦,这里 beanstalkd 的 tube 与 gearman 的 function 的区别是?
    webgeekman
        4
    webgeekman  
       2013-01-03 18:15:47 +08:00
    最适合你需求的:ActiveMQ 前阵子好像有人问过。
    notedit
        5
    notedit  
       2013-01-03 18:18:03 +08:00
    你可以把tube想成一个队列

    比如A类型的消息放到A_tube B类型的消息放到B_tube中
    darasion
        6
    darasion  
    OP
       2013-01-03 18:25:50 +08:00
    @notedit
    我的队列也有无数个,这个是否支持无数个tube?
    我的消费者也可能有无数个,但是同一时间必须只有一个消费者在处理这个tube的队头job,也就是给tube加锁,这样能实现不?
    notedit
        7
    notedit  
       2013-01-03 18:44:36 +08:00
    @darasion beantalkd是支持的

    但看你的需求确实有点奇怪 如果你的消息不是很大的话 可以考虑直接用关系数据库
    darasion
        8
    darasion  
    OP
       2013-01-04 00:05:18 +08:00
    @notedit 嗯... 又仔细想了想,我实际上需要的是一种锁,只要特征相同的任务,就必须获得这个特征锁才能执行,否则就要等 或者 废弃。
    darasion
        9
    darasion  
    OP
       2013-01-05 18:47:53 +08:00
    最终使用了 mysql 的行锁,只要保证锁住的事务是原子就好了。
    看看后续效果。
    @notedit
    @raspberry
    @webgeekman
    webgeekman
        10
    webgeekman  
       2013-01-05 20:44:59 +08:00
    @darasion 是个可行的办法,非常感谢将最后的解决方案贴出来。不过还是很推荐ActiveMQ :)支持的承载协议也比较多,以后集群扩展也很方便。
    jimrok
        11
    jimrok  
       2013-01-05 21:50:17 +08:00
    Redis+数据库也许可以实现。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2808 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 11:57 · PVG 19:57 · LAX 03:57 · JFK 06:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.