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

发布于 2016-11-28 02:32:52 字数 192 浏览 1396 评论 1

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

夜无邪 2017-05-02 11:19:01

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. 还有很多 :)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文