ActiveMQ用于什么?

111 activemq-classic

我查了一下你就发了信息.但为什么?为什么不使用数据库?必须有功能ActiveMQ有数据库不?

Hir*_*ino 173

它用于在两个分布式进程之间可靠地通信.是的,您可以将消息存储在数据库中以在两个进程之间进行通信,但是,一旦收到消息,您就必须删除该消息.这意味着每个消息的行插入和删除.当您尝试扩展每秒传输数千条消息时,数据库往往会倒下.

另一方面,像ActiveMQ这样的面向消息的中间件是为处理这些用例而构建的.他们假设健康系统中的消息将被非常快速地删除,并且可以进行优化以避免开销.它还可以将消息推送到消费者,而不是消费者必须通过执行SQL查询来轮询新消息.这进一步减少了处理发送到系统中的新消息所涉及的延迟.


Pet*_*der 62

ActiveMQ,或者通常所有面向消息的中间件(MOM)实现都是为了在一个应用程序内的两个应用程序或两个组件之间发送消息而设计的.

从本质上讲,MOM和数据库共享一个共同的基础,因为它们提供了可以读写的事务和持久数据存储.最大的区别在于使用模式 - 数据库非常通用,并针对多个表的复杂搜索进行了优化,MOM针对以类似FIFO的方式一次一个地读取消息进行了优化.

JMS是一个API ActiveMQ实现的,是Java Enterprise应用程序中的重要基石.这使得消息共享相当普通的格式和语义,这使得不同应用程序之间的集成更容易.

当然,还有很多更详细的功能,只有在ActiveMQ,有线协议如OpenWire,STOMP和MQTT,JMS,EIP和Apache Camel,消息模式如"请求/回复"和"发布/订阅",JMS桥接,群集("经纪人网络"),允许扩展和分发等.如果您感兴趣,您应该仔细阅读这些主题,因为它们相当大.


小智 22

Active MQ具有出色的调度程序支持,这意味着您可以安排在特定时间发送消息.我们使用此功能向患者发送药物提醒,以便在医疗保健方案中上传他们的药物详细信息.

  • 那很酷.我们使用Quartz调度库进行类似的提醒. (2认同)

小智 13

使用RDBMS,当您处理一行数据时,通常会更新一个标志,指示该行已被处理,以便不重复处理.

但是,使用Message Queue,您只需要确认一条消息,下一个消费者将处理下一个消息.

区别在于UPDATERDBMS中的语句与acknowlegeactivmeq 相比是一个非常慢的操作.


Rav*_*abu 7

来自维基百科

Apache ActiveMQ是一个用Java编写的开源消息代理,同时具有完整的Java Message Service(JMS)客户端。它提供“企业功能”,在这种情况下,这意味着促进来自多个客户端或服务器的通信

关于您的查询:

你为什么不使用数据库?

您应该将数据库用于持久数据,而不是临时数据。假设您必须从发件人向接收方发送一条消息。接收到消息后,接收方将执行一项操作(接收,处理和忘记)。处理完该消息后,您根本不需要该消息。在这种情况下,将消息存储在持久数据库中不是正确的解决方案。

如果您使用数据库而不是消息传递系统,则我完全同意@Hiram Chirino有关在数据库中插入和删除消息的答案。

本文本文中受益

  1. 企业集成:允许使用不同语言和不同操作系统构建的应用程序相互集成
  2. 位置透明:客户端应用程序不需要知道服务应用程序的位置
  3. 可靠的通信 –消息的生产者/消费者不必同时使用
  4. 扩展 –可以通过添加更多服务来水平扩展
  5. 异步通信 –客户端可以触发消息并继续其他处理,而不会阻塞直到服务发送响应为止;
  6. 减少耦合 –由于前5个优点,大大减少了客户和服务的假设。服务可以更改有关其自身的详细信息,包括其位置,协议和可用性,而不会影响或破坏客户端。

ActiveMQ必须具有数据库没有的功能?

有许多。请查看文档页面以获取更多详细信息。也看一下用例

查看此演示文稿以了解ActiveMQ的内部。


Vin*_*ino 7

我想强调以下几点:

解耦:系统无需连接即可进行通信.队列位于系统之间,一个系统故障永远不会影响其他系统,因为通过队列进行通信.这些系统在启动时继续工作.

恢复支持:队列中的消息本身仍然存在.如果队列失败,可以稍后恢复消息.

可靠的通信:考虑一个处理客户端请求的系统.在正常情况下,系统每分钟接收100个请求.当请求数超过平均值时,该系统不可靠.在这种情况下,Queue可以管理请求,它可以根据系统吞吐量定期推送消息,而不会破坏它.

异步:客户端服务器通信是非阻塞的.客户端向服务器发送请求后,无需等待响应即可执行其他操作.当收到响应时,客户端可以随时处理它.