Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ActiveMQ的用途是什么?我们可以使用数据库应用消息传递概念吗?_Activemq - Fatal编程技术网

ActiveMQ的用途是什么?我们可以使用数据库应用消息传递概念吗?

ActiveMQ的用途是什么?我们可以使用数据库应用消息传递概念吗?,activemq,Activemq,我查了一下,它用于在两个系统之间发送消息。 但是为什么呢?为什么不直接使用数据库? ActiveMQ必须有一些数据库不具备的功能ActiveMQ,或者一般来说,所有面向消息的中间件(MOM)实现都是为了在两个应用程序之间或一个应用程序内的两个组件之间发送消息而设计的 基本上,MOM和数据库有一个共同的基础,即它们提供事务性和持久性的数据存储,以便能够从.BR>进行读写。 最大的区别在于使用模式——数据库非常通用,并针对多个表的复杂搜索进行了优化,而MOM则针对读取消息进行了优化,一次读取一条消息

我查了一下,它用于在两个系统之间发送消息。
但是为什么呢?为什么不直接使用
数据库


ActiveMQ
必须有一些数据库不具备的功能

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

基本上,MOM和数据库有一个共同的基础,即它们提供事务性和持久性的数据存储,以便能够从.BR>进行读写。 最大的区别在于使用模式——数据库非常通用,并针对多个表的复杂搜索进行了优化,而MOM则针对读取消息进行了优化,一次读取一条消息,以类似FIFO的方式[队列]

JMS
,它是ActiveMQ实现的API,是Java企业应用程序的重要基石。这使得消息共享一种相当通用的格式和语义,从而使不同应用程序之间的集成更加容易

当然,还有很多更详细的特性只存在于ActiveMQ中,比如
OpenWire
STOMP
MQTT
JMS
EIP
以及ApacheCamel,消息模式如“请求/回复”和“发布/订阅”,JMS桥接,集群(“代理网络”),允许缩放和分布等。

如果您对这些主题感兴趣的话,您应该仔细阅读一下,因为它们非常大。

它用于在两个分布式进程之间进行可靠的通信

是的,您可以将消息存储在数据库中以在两个进程之间进行通信,但是,一旦收到消息,您就必须
删除该消息,这意味着为每条消息插入一行
删除

当您试图扩展每秒传输数千条消息时,数据库往往会崩溃

另一方面,像
ActiveMQ
这样的面向消息的中间件[MOM]是为处理这些用例而构建的。
他们假设一个健康系统中的消息会很快被删除,并且可以进行优化以避免开销

它还可以将消息推送到消费者,而不是消费者必须通过执行SQL查询来轮询新消息。

这进一步减少了处理发送到系统中的新消息所涉及的延迟。

ActiveMQ
具有强大的调度程序支持,这意味着您可以安排在特定时间发送消息


我们已使用此功能向在医疗场景中上载药物详细信息的患者发送药物提醒。

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

但是,使用消息队列,您只需确认一条消息,下一个使用者将处理下一条消息

区别在于,RDBMS中的
UPDATE
station与activmeq中的
acknowledge
相比是一个非常缓慢的操作

ApacheActiveMQ是一个用Java编写的开源消息代理和一个完整的Java消息服务(JMS)客户端。它提供了“企业特性”,在这种情况下,这意味着促进来自多个客户机或服务器的通信

关于您的疑问:

你为什么不使用数据库

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

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

从这个和这个中受益

  • 企业集成:允许使用不同语言和不同操作系统构建的应用程序相互集成
  • 位置透明度:客户端应用程序不需要知道服务应用程序的位置
  • 可靠的通信–信息的生产者/消费者不必同时可用
  • 扩展–可以通过添加更多服务水平扩展
  • 异步通信–客户端可以触发消息并继续其他处理,而不是阻塞,直到服务发送响应为止
  • 减少耦合–由于之前的5项好处,客户和服务做出的假设大大减少。服务可以更改自身的详细信息,包括其位置、协议和可用性,而不会影响或中断客户端
  • ActiveMQ必须有数据库没有的功能

    有很多。有关更多详细信息,请参阅第页。也来看看


    请看一看,以了解ActiveMQ的内部结构。

    我想强调以下几点:

    解耦:系统无需连接即可通信。队列位于系统之间,一个系统故障不会影响另一个系统,因为通信是通过队列完成的。系统启动后仍能继续工作

    恢复支持:队列中的消息本身保持不变。如果队列失败,可以稍后恢复消息

    可靠通信:缺点
    INSERT INTO pdf_job_queue (name, status, email) VALUES ("White paper", "NEW", "myemail@example.com");
    
    SELECT * FROM pdf_job_queue WHERE queue = 'resize_queue' AND handled = false ORDER BY date_recived limit 1;
    
    update pdf_job_queue set Status="FINISHED" where Id = 'SomeId';