我的系统,有一部分的业务是“查询其它系统的订单处理结果,然后更新我的订单状态”。
目前问了两个“前辈”,都说写定时任务,去数据库里扫表,拿出处理中的订单,去挨个轮询状态。
我一直以为这种操作(查其它系统,修改自己订单的操作。)应该扔给消息队列,作为异步任务去处理。
但是前辈说,消息队列,不安全,会丢失,那么我想请教两个问题。
1.消息队列不安全,会丢失,是指什么?是指载体,类似 rabbitmq 和 redis 数据是放在内存的?难倒不可以持久化么?还是其它原因?
2.是不是相比于“查询补单”这样的业务,将结果通知给其它系统,这种业务更适合使用消息队列的异步任务( rabbitmq+celery )。
1
yinheli 2015-11-05 11:50:34 +08:00
交易系统, 使用过 rabbitmq, 对于重要的消息可以开启持久化和手工确认, 不会丢失.
目前大部分的消息, 异步处理业务全部是通过 rabbitmq 处理, 实时性和效果都非常好. |
2
lianz 2015-11-05 12:43:52 +08:00
有部分消息队列软件是仅存在内存里,不持久化的,如果出问题的话真的就丢了。所以,要用能持久化的软件(效率会降低),比如楼上说的 rabbitmq ,还有其他一系列 mq 都可以用, google 一下
|
3
HentaiMew 2015-11-05 12:53:54 +08:00
大部分 JMS 实现产品都能持久化队列消息的…例如 kafuka 这种不完全为了实现 JMS 的消息中间件都会把未处理的消息持久化,更别提 AMQ 或者 RMQ 了
|
4
tonyVex 2015-11-05 13:09:40 +08:00
rabbitmq 支持持久化,当然这样会降低效率。
|
5
sunus 2015-11-05 13:15:12 +08:00
因为前辈对消息队列不了解
你让前辈们给你讲讲他们用过哪些消息队列?消息队列支持事物么?数据库怎么支持事物的,为啥数据库数据不会丢失 |
6
adrianzhang 2015-11-05 13:23:21 +08:00
为啥不问问那两个前辈“ why ”?
|
7
wuliao49 2015-11-05 13:45:33 +08:00 1
这种说法我觉得是有一定道理的,具体看要场景。
以前我再某大型国有金融机构工作过,买的是 IBM 的 MQ ,应该说无论哪方面 MQ 都强过 rabbitmq 。 但是用下来确实有问题,某些情况下,一旦队列满了,为保证时效性,不得不手动清理,丢过很多重要数据。 |
9
9hills 2015-11-05 13:52:10 +08:00
支付宝就用消息队列。。
|
10
lucky2touch 2015-11-05 13:54:54 +08:00 1
从另外一个角度看一下,也许前辈就是敷衍你一下,一般来说,引入新的技术就有新的风险。
1.消息可以持久化,也支持事务,有其它情况,比如队列满了需要处理等等,设备要不要配盘阵之类。 2.业务不是很明白,一般来说有数据交互的地方都可以用消息中间件,一对多还可以用 topic 啥的。 一般我认为有把握可以在自己系统范围内尝试,但是如果涉及要别人配合你修改代码或架构就比较麻烦了...... |
12
aiqier OP @lucky2touch 是不是比起补状态任务,通知才更适合用消息队列做异步部任务,因为后者任务不需要太多的逻辑判断和异常考虑?
|
13
clino 2015-11-05 14:22:20 +08:00
我觉得即使消息队列有丢失的可能 也可以想办法做到安全的
|
14
huson 2015-11-05 14:45:27 +08:00
你可以写个 demo 出来给他们看 问问他们哪里不安全了。。
|
15
julyclyde 2015-11-05 14:49:30 +08:00
应该是前辈对(他们自己)未知的事物怀恐惧心理
|
16
huobazi 2015-11-05 15:07:46 +08:00
那前辈快混到退休了吧。
|
17
akira 2015-11-05 15:14:49 +08:00
对于自己不熟悉的东西,最好摸清楚了再用。。
|