>数据永久存储在表上.我已经看到这么多的java(jms)应用程序丢失或消失消息的方式来捕获未捕获的异常或其他错误.
队列往往填满.相反,Db存储几乎是无限的.
>表易于访问,而您必须使用esotic乐器从队列中读取.
你对每种方法有什么看法?
解决方法
如果您正在构建一个已经使用数据库的单一系统,则您的性能吞吐量要求不高,您不必与任何其他团队或系统进行通信,那么您可能是对的.
对于简单,低通量,大多数单线程的东西,数据库是消息队列的完美替代品.
消息队列发光的地方在何处
>您想要一个高性能,高度并发和可扩展的负载平衡器,因此您可以在许多服务器/进程中同时处理数以万计的消息(使用数据库表,您将很幸运处理几百秒,并处理多线程很难,因为一个进程会倾向于锁定消息队列表)
>您需要使用不同的数据库在不同系统之间进行通信(因此,不必向不同团队的其他人员传递对系统数据库的写访问权限)
对于具有单个数据库的简单系统,团队和相当适度的性能要求 – 一定要使用数据库.使用正确的工具等等
然而,在大型组织中,消息队列闪耀的地方有很多系统需要彼此通信(因此您不希望商业数据库成为故障的中心点或版本地狱的地方),或者当您有高性能要求.
在性能方面,消息队列将始终击败数据库表,因为消息队列是专为该作业设计的,并且不依赖于悲观的表锁(这是队列的数据库实现所必需的)进行负载平衡)和good message queues will perform eager loading of messages to queues to avoid the network overhead of a database.
同样,您绝对不会使用数据库来对Web服务器之间的HTTP请求进行负载平衡,因为它太慢了 – 如果您对不使用数据库的负载平衡器有很高的性能要求.