求一个技术解决方案

2013-01-03 16:58:49 +08:00
 darasion
我有无数多个任务,根据业务随机产生:
1. 要保证满足同一特征(比如hash key、id什么的)的任务都在同一个队列中先进先出顺序执行(fifo)。
2. 没有完成的任务需要持久化保存,也就是说断电或 kill 进程也不能丢任务。
3. 队列生命周期可能非常长,几年也有可能。


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

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

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

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

但看你的需求确实有点奇怪 如果你的消息不是很大的话 可以考虑直接用关系数据库
darasion
2013-01-04 00:05:18 +08:00
@notedit 嗯... 又仔细想了想,我实际上需要的是一种锁,只要特征相同的任务,就必须获得这个特征锁才能执行,否则就要等 或者 废弃。
darasion
2013-01-05 18:47:53 +08:00
最终使用了 mysql 的行锁,只要保证锁住的事务是原子就好了。
看看后续效果。
@notedit
@raspberry
@webgeekman
webgeekman
2013-01-05 20:44:59 +08:00
@darasion 是个可行的办法,非常感谢将最后的解决方案贴出来。不过还是很推荐ActiveMQ :)支持的承载协议也比较多,以后集群扩展也很方便。
jimrok
2013-01-05 21:50:17 +08:00
Redis+数据库也许可以实现。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/56492

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX