概念
JMS
Java Message Service
JMS即Java消息服务,是java平台上有关面向消息中间件的技术规范,是JavaEE十三个规范之一。
面向消息
之前,不同组件之间通信是通过:
一个组件调用另一个组件的方法。
这种调用,有直接调用,也有像EJB的SessionBean中的远程方式调用或以WebService方式调用。
弊端:通信方式必须是同步的(即调用者调用方法成功之后,才能再执行接下来的代码);两个组件是耦合在一起的。
面向消息的通信:
一个组件把消息发送到目的地,另一个组件监听目的地,待消息到达后,获取消息,执行方法。
优点:通信方式可以是同步,也可以是异步,比较灵活;两个组件不用耦合在一起,解耦合。
两种消息模型
PTP
点对点消息类型:消息发送给一个单独的使用者。
消息队列(Queue)、发送者(Sender)、接收者(Receiver)。
- 每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到它们被消费或超时。
- 每个消息只有一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中)
- 发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行,它不会影响到消息被发送到队列。
- 如果消费者暂时不在,消息服务器会将消息保存到永久介质上。
- 接收者在成功接收消息之后需向队列应答成功。
如果你希望发送的每个消息都应该被成功处理的话,那么你需要P2P模型
Pub/Sub
发布/订阅消息类型:支持一个事件驱动模型,生产者和消费者都残余消息的传递。
主题(Topic)、发布者(Publisher)、订阅者(Subscriber)。
- 客户端将消息发送到主题。多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。
- 每个消息可以有多个消费者
- 发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个订阅之后,才能消费发布者的消息,而且,为了消费消息,订阅者必须保持运行的状态。
- 当然,为了缓和这种严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。
如果你希望发送的消息可以不被做任何处理、或者被一个消费者处理、或者可以被多个消费者处理的话,那么可以采用Pub/Sub模型。
比较方面 | PTP | Pub/Sub |
---|---|---|
消息的消费者个数 | 1 | 1或多 |
消费者是否运行对消息消费的影响 | 不管是否运行,消息会发送到队列,甚至被保存到数据库或文件中 | 不运行就消费不了消息,但是允许一个持久化的订阅,没运行也能接收 |
是否需要应答 | 需要 | 不需要 |
消息的消费
同步 – 订阅者或接收者调用receive方法来接收消息,receive方法在能够接收到消息之前(或超时之前)将一直阻塞。
异步 – 订阅者或接收者可以注册为一个消息监听器。当消息到达之后,系统自动调用监听器的onMessage方法。而MDB就是这里的消息监听者。
MDB
组件将消息发送到指定消息目的地,而MDB负责监听此消息目的地,当该消息到达时,由容器负责调用MDB,接收并处理消息。
技术前瞻
消息中间件有很多。
阿里的Notify
分布式发布订阅消息系统: Kafka
分布式消息中间件 Metamorphosis(MetaQ)
……
想了解更多,点击这里