消息中间件activeMQ入门使用和高可用集群部署架构
Posted 云架构师大白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了消息中间件activeMQ入门使用和高可用集群部署架构相关的知识,希望对你有一定的参考价值。
1 JMS
首先来说较早以前,也就是没有JMS的那个时候,很多应用系统存在一些缺陷:
通信的同步性:client端发起调用后,必须等待server处理完成并返回结果后才能继续执行
client 和 server 的生命周期耦合太高:client进程和server服务进程都必须可用,如果server出现问题或者网络故障,那么client端会收到异常
点对点通信:client端的一次调用只能发送给某一个单独的服务对象,无法一对多
JMS,即Java Message Service,通过面向消息中间件(MOM:Message Oriented Middleware)的方式很好的解决了上面的问题。大致的过程是这样的:发送者把消息发送给消息服务器,消息服务器将消息存放在若干队列/主题中,在合适的时候,消息服务器会将消息转发给接受者。在这个过程中,发送和接受是异步的,也就是发送无需等待,而且发送者和接受者的生命周期也没有必然关系;在pub/sub模式下,也可以完成一对多的通信,即让一个消息有多个接受者。
2 消息模型
2.1 Point-to-Point(P2P点对点)
每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到他们被消费或超时;一旦被消费或者超时,消息就会从消息队列中删除;发送者和接收者无依赖关系;接收者在成功接收消息之后需向队列应答成功,如果你希望发送的每个消息都应该被成功处理的话,那么你需要P2P模式。
2.2 Publish/Subscribe(Pub/Sub发布订阅模式)
客户端将消息发送到主题。多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者;每个消息可以有多个消费者;如果你希望发送的消息可以不被做任何处理、或者被一个消息者处理、或者可以被多个消费者处理的话,那么可以采用Pub/Sub模型
3 消息的消费
在JMS中,消息的产生和消费是异步的。对于消费来说,JMS的消费者可以通过两种方式来消费消息。
○ 同步
订阅者或接收者调用receive方法来接收消息,receive方法在能够接收到消息之前(或超时之前)将一直阻塞
○ 异步
订阅者或接收者可以注册为一个消息监听器。当消息到达之后,系统自动调用监听器的onMessage方法。
4 JMS编程模型
(1) ConnectionFactory
创建Connection对象的工厂,针对两种不同的jms消息模型并通过TCP(或其他协议)连接到activeMQ服务端,分别有QueueConnectionFactory和TopicConnectionFactory两种。
(2) Destination
Destination的意思是消息生产者的消息发送目标或者说消息消费者的消息来源。对于消息生产者来说,它的Destination是某个队列(Queue)或某个主题(Topic);对于消息消费者来说,它的Destination也是某个队列或主题(即消息来源)。
(3) Connection
Connection表示在客户端和JMS系统之间建立的链接(对TCP/IP socket的包装)。Connection可以产生一个或多个Session。跟ConnectionFactory一样,Connection也有两种类型:QueueConnection和TopicConnection。
(4) Session
Session是我们操作消息的接口。可以通过session创建生产者、消费者、消息等。Session提供了事务的功能。当我们需要使用session发送/接收多个消息时,可以将这些发送/接收动作放到一个事务中。同样,也分QueueSession和TopicSession。
(5) 消息的生产者
消息生产者由Session创建,并用于将消息发送到Destination。同样,消息生产者分两种类型:QueueSender和TopicPublisher。可以调用消息生产者的方法(send或publish方法)发送消息。
(6) 消息消费者
消息消费者由Session创建,用于接收被发送到Destination的消息。两种类型:QueueReceiver和TopicSubscriber。可分别通过session的createReceiver(Queue)或createSubscriber(Topic)来创建。当然,也可以session的creatDurableSubscriber方法来创建持久化的订阅者。
(7) MessageListener
消息监听器。如果注册了消息监听器,一旦消息到达,将自动调用监听器的onMessage方法。EJB中的MDB(Message-Driven Bean)就是一种MessageListener。
5 安装方法
下载安装运行都很简单http://activemq.apache.org/download.html
安装完之后访问 http://127.0.0.1:8161/admin/index.jsp 可以看到各种统计类和监控数据
6 activeMQ技术功能要点
activeMQ可以选择是否采用数据持久化存储,如果采用数据持久化存储,默认采用的是kahadb,当然我们可以采用leveldb,或者采用JDBC存储到mysql
Session,用于发送和接受消息,而且是单线程的,支持事务的。如果Session开启事务支持,那么Session将保存一组信息,要么commit到MQ,要么回滚这些消息。
消息类型有text字符串、map键值对、stream原始值、object对象、bytes字节数据流
实际业务一般是在发送消息时候才决定将该消息发送给哪个Queue。
虽然有消息优先级,activeMQ并不保证消息的顺序性,如果要保证消息的顺序性,需要应用设计来保证,例如应用先发送查询库存消息,等查询订单消息返回后在发扣除库存消息。
对于发布订阅模式,对订阅者提出了特殊的要求,要想收到消息,必须先订阅,而且订阅进程必须一直处于运行状态!实际上,有时候消费者重启了下,那么这个消费者将丢失掉一些消息,那么能否避免这样的情况呢?可以采用持久化订阅,即计算消费者不在线,MQ会把消息缓存直到消费者在线后在发给消费者。
7 activeMQ非功能要点(高可用、高性能)
模式1、可以配置最基本的主备模式,主节点和备份节点都有自己的数据库,主节点消息数据会同步到备份节点。正常情况下只有主节点对外提供服务。
模式2、也可以配置一主多备模式,所有节点共享一个数据库,正常情况下只有主节点能使用数据库,该模式需要多节点使用同一个共享磁盘。可以加入zookeeper来保证高可用,需要保证集群数量为大于等于3的单数。
模式3、多活模式(但是无数据库也无数据复制),采用多节点均对外提供服务,但是不进行数据复制,这样如果某节点发生故障,该节点上未被消费的消息会丢失。
模式4、可以通过networksof brokers,形成真正的多活多节点activeMQ,每个MQ节点都有自己的数据库,业务消息可以随机的发给多节点MQ,MQ之间会进行双向甚至多向的消息的同步。
以上是关于消息中间件activeMQ入门使用和高可用集群部署架构的主要内容,如果未能解决你的问题,请参考以下文章