消息队列如果持久化到数据库的话,相对于直接操作数据库有啥优势?


Activemq可以将消息持久化到Mysql中。未被取走的消息存在Mysql中,消息被取走后,会从Mysql中删除。Mysql中保存的是消息的副本呢还是消息本身?如果是消息本身的话,那岂不是相当于直接进行数据库读写操作了?这是我在知乎上提出的问题http://www.zhihu.com/question/19946006,没有收到满意回复,希望能在此宝地得到高手指点~

数据库 消息队列

戦場原くろこ 11 years, 6 months ago
  1. activemq在逻辑上用tranction实现了和mysql的消息一致性
  2. 在实现上,activemq当然会有自己在内存中的的消息队列。参考 activemq-core/src/main/java/org/apache/activemq/ActiveMQMessageConsumer.java

MessageDepatch.dequeue(...)

   
  while (true) {
  
MessageDispatch md = unconsumedMessages.dequeue(timeout);
if (md == null) {
.....
} else if (md.getMessage() == null) {
return null;
} else if (md.getMessage().isExpired()) {
if (LOG.isDebugEnabled()) {
LOG.debug(getConsumerId() + " received expired message: " + md);
}
beforeMessageIsConsumed(md);
........

3. 你得到的好处就是为什么使用mq的好处,几个简单的free benifit,

a. 你不用面对直接db的操作
b. 你可以使用不同的数据源无需编码
c. 你避免了处理消息的producer和consumer之间的transaction的复杂处理
d. 如果是pub/sub的模式,你用db直接操作会比较困难
e. 你的消息可以有seq和expire time等一系列handy的属性,操作db也无法简单模拟
f. 还有很多 :)

吾王Saber answered 11 years, 6 months ago

Your Answer