有这样的一个业务场景,生产者发送消息后,一个以点对点的模式接收,一个已发布订阅的模式接收。当然我们可以做,生产者发送两个Destination,一个是点对点模式,一个是发布订阅模式。这样比较麻烦,activemq也提供了他的方法来处理这样的场景:
示例
生产者的主要代码如下:
1 | session.createQueue("test.ptp,topic://test.topic"); |
有这样的一个业务场景,生产者发送消息后,一个以点对点的模式接收,一个已发布订阅的模式接收。当然我们可以做,生产者发送两个Destination,一个是点对点模式,一个是发布订阅模式。这样比较麻烦,activemq也提供了他的方法来处理这样的场景:
生产者的主要代码如下:
1 | session.createQueue("test.ptp,topic://test.topic"); |
ActiveMQ有点对点和发布订阅两种方式,这两种的消息存储还是有稍微一点区别。
队列的存储比较简单,就是先进先出(FIFO),只有当该消息已被消费和确认可以删除消息存储。如果没有被确认,其他消费者是不能获取消息的。
看看下面的例子:
生产者发送了10条消息:
MasterSlave方式中,master提供服务,slave备份master的数据。当master挂掉后,slave会变成master继续工作。
基于共享文件系统,第一个获取文件上的独占锁的broker,就是master,如果这个broker挂了,其他broker获取文件上的独占锁,就从slave变成master。
broker61616、broker61618、broker61619的persistenceAdapter配置如下:
静态网络连接是通过显示的定义网络地址,这无疑给我们的工作量带来了一定的麻烦,现在看看动态的网络连接。
多播的默认格式如下:
1 | multicast://ipaddress:port?key=value |
broker和broker用的是多播协议:通过IP进行一对多通信网络,生产者使用这个地址作为数据的目的地,而消费者使用它来表达他们对数据关注的来源。
client和broker用的是Discovery协议,它将使用多播来发现可用的broker然后随机选择一个连接到broker。
61616的activemq.xml配置
如下图所示,生产者往broker61616发送消息,消费者通过broker61618接收消息。broker61616和broker61618通过networkConnectors连接。
Consumer的代码如下:
1 | private static final String BROKEURL = "failover:(tcp://0.0.0.0:61618,tcp://0.0.0.0:61616)"; |
当系统需要高性能以及扩展性的时候,单个broker已经不满足我们的需求了,我们可以把多个broker连接起来,来达到我们需要的效果。ActiveMQ支持双向的网络连接通道,如下图所示
多个broker之间的连接,有两种方式,一个是静态网络连接,一个是动态网络连接。
ActiveMQ提供了多种协议,配置transportConnectors的时候,根据不同的协议配置uri,比如:
消息的几种类型,包括TextMessage、StreamMessage、ObjectMessage、MapMessage、BytesMessage、BlobMessage。属性包括boolean、byte、double、float、int、long、object、short、string。下面看看在代码中是怎么发送和接收的。
1 | public static void main(String[] args) { |
索引是一种用于快速查询和检索数据的数据结构,其本质可以看成是一种排序好的数据结构。
索引的作用就相当于书的目录。打个比方: 我们在查字典的时候,如果没有目录,那我们就只能一页一页的去找我们需要查的那个字,速度很慢。如果有目录了,我们只需要先去目录里查找字的位置,然后直接翻到那一页就行了。
索引底层数据结构存在很多种类型,常见的索引结构有: B 树, B+树 和 Hash、红黑树。在 MySQL 中,无论是 Innodb 还是 MyIsam,都使用了 B+树作为索引结构。
优点:
官方文章参考: how-should-i-implement-request-response-with-jms
在生产过程中,我们有可能需要消费者消费完后,把消息发给对应的生产者。
这种请求-响应的最佳方法是在启动时为每个生产者创建一个临时队列和使用者,将每个消息上的JMSReplyTo属性设置为临时队列,然后在每个消息上使用correlationID将请求消息与响应消息关联起来。这避免了为每个请求创建和关闭使用者的开销(这是昂贵的)。这也意味着你可以共享同一个生产者。
消费者消费完消息后,通过JMSReplyTo属性和correlationID将消息返回给生产者。
流程图如下:
步骤如下:
代码如下:
1 | public static void main(String[] args) { |