写点什么

完全可以使用 RDBMS 作为消息队列

  • 2014-10-09
  • 本文字数:779 字

    阅读完需:约 3 分钟

Lukas Eder JOOQ 母公司的创始人兼 CEO。近日,他针对《将数据库作为消息队列是一种反模式》一文的观点及其在 reddit 上引发的争论表达了看法。他认为,使用数据库作为消息队列不是一种反模式,理由如下:

  1. KISS 和 YAGNI 原则——如果使用 RDBMS 可以满足消息传递的需求,那么就不必花费时间和金钱引入一款复杂的消息队列工具;
  2. 事务性队列——即使使用成熟的消息队列工具,要实现事务性队列依然很复杂,而使用基于 RDBMS 的队列则可以避免事务处理的复杂性;
  3. 无需额外的运维工作——引入新的外部系统会增加运维成本;
  4. 如果已经使用了 Oracle 数据库,则可以直接使用其内置的队列 API Oracle AQ
  5. 以 RDBMS 为中心的应用程序更简单——数据的存在时间大于应用程序,比如, Paypal 从 Java 切换到 JavaScript ,但他们并没有替换掉所有的数据库。因此,如果 RDBMS 是系统的中心,那么在 RDBMS 中运行消息队列是一种选择。

但有位自称见过多个此类案例的读者列举了这种做法面临的几项挑战:

  1. 数据库没有有丢弃和限流策略,如果信息产生速度大于消费速度,那么消息表就会变得越来越大。
  2. 数据库表可以针对写优化,也可以针对读优化,但无法同时对两者进行优化。
  3. 数据库无法对一个数据项进行并发处理。
  4. 大批量的数据处理会产生长事务,事务越长锁的持有时间越长。

Lukas 承认,使用 RDBMS 作为消息队列有一些注意事项。但针对第三点,他提到,Oracle AQ 针对 FOR UPDATE 语句进行了扩展,提供了 FOR UPDATE SKIP LOCKED 语句。该语句允许对记录进行非阻塞式悲观锁定,提高了并发性。

另外,还有一位读者提到, Spring Integration 支持使用数据库存储队列消息,有兴趣的读者可以对此进行研究测试。


感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2014-10-09 03:341549
用户头像

发布了 1008 篇内容, 共 392.7 次阅读, 收获喜欢 344 次。

关注

评论

发布
暂无评论
发现更多内容

压测工具

Acker飏

charles断点使用方法

rainbow

Week 07 学习总结

Jeremy

脑洞:基于DDD进行组织架构治理

冯文辉

组织转型 领域驱动设计 DDD

k8s 上运行我们的 springboot 服务之——flume 读取kafka数据批量同步到clickhouse

柠檬

kafka Clickhouse

爱币(LOVE COIN)全球同步耀世上线,掀起币圈追捧热潮

Geek_116789

架构师训练营第 7 周学习总结

Season

架构师第七周 作业

冯凯

第七周·周总结

刘璐

第七周·命题作业·写 web 性能压测工具

刘璐

系统性能优化总结

极客李

Week 07 命题作业

Jeremy

JVM系列之:Contend注解和false-sharing

程序那些事

Java JVM 性能调优 GC

Summary

Kiroro

web 性能压测工具

莫莫大人

ChaosBlade:从零开始的混沌工程(四)

郭旭东

云原生 混沌工程 ChaosBlade

第七周总结

晨光

你在寻找本地部署的后台测试工具吗?

测试那些事儿

作业一

Kiroro

性能压测的时候,随着并发压力的增加,系统响应时间和吞吐量如何变化,为什么?

极客李

新站上线通知

Damon

第七周作业

晨光

架构师 第七周总结

冯凯

lambda基本使用

Bruce Duan

Lambda

第七周总结

Acker飏

一文入门DNS?从访问GitHub开始

Kerwin

后端 DNS DNS服务器

Java 基础

Bruce Duan

java基础

SpringBoot教程:MyBatis多数据源配置

Bruce Duan

mybatis SpringBoot 2 多数据源配置

SQL查找还在用count吗?

Bruce Duan

SQL查询是否存在

一文吃透时间复杂度和空间复杂度

书旅

数据结构 算法 时间复杂度 数据结构与算法

go defer 的使用和陷阱

曲镇

Go 语言

完全可以使用RDBMS作为消息队列_数据库_谢丽_InfoQ精选文章