消息队列如果持久化到数据库的话,相对于直接操作数据库有啥优势?
Activemq可以将消息持久化到Mysql中。未被取走的消息存在Mysql中,消息被取走后,会从Mysql中删除。Mysql中保存的是消息的副本呢还是消息本身?如果是消息本身的话,那岂不是相当于直接进行数据库读写操作了?这是我在知乎上提出的问题http://www.zhihu.com/question/19946006,没有收到满意回复,希望能在此宝地得到高手指点~
戦場原くろこ
12 years, 2 months ago
Answers
- activemq在逻辑上用tranction实现了和mysql的消息一致性
- 在实现上,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 12 years, 2 months ago