php数据结构对列 php对数据库的操作( 三 )


以上实际是消息队列的两种消息模式,点对点或发布订阅模式 。模型为示意图,供参考 。
三、消息中间件示例
3.1电商系统
消息队列采用高可用,可持久化的消息中间件 。比如Active MQ,Rabbit MQ,Rocket Mq 。(1)应用将主干逻辑处理完成后 , 写入消息队列 。消息发送是否成功可以开启消息的确认模式 。(消息队列返回消息接收成功状态后,应用再返回,这样保障消息的完整性)
(2)扩展流程(发短信,配送处理)订阅队列消息 。采用推或拉的方式获取消息并处理 。
(3)消息将应用解耦的同时,带来了数据一致性问题,可以采用最终一致性方式解决 。比如主数据写入数据库,扩展应用根据消息队列 , 并结合数据库方式实现基于消息队列的后续处理 。
3.2日志收集系统
分为Zookeeper注册中心,日志收集客户端,Kafka集群和Storm集群(OtherApp)四部分组成 。
Zookeeper注册中心,提出负载均衡和地址查找服务;
日志收集客户端 , 用于采集应用系统的日志,并将数据推送到kafka队列;
四、JMS消息服务
讲消息队列就不得不提JMS。JMS(Java Message Service,Java消息服务)API是一个消息服务的标准/规范 , 允许应用程序组件基于JavaEE平台创建、发送、接收和读取消息 。它使分布式通信耦合度更低,消息服务更加可靠以及异步性 。
在EJB架构中,有消息bean可以无缝的与JM消息服务集成 。在J2EE架构模式中,有消息服务者模式 , 用于实现消息与应用直接的解耦 。
4.1消息模型
在JMS标准中,有两种消息模型P2P(Point to Point),Publish/Subscribe(Pub/Sub) 。
4.1.1 P2P模式
P2P模式包含三个角色:消息队列(Queue),发送者(Sender) , 接收者(Receiver) 。每个消息都被发送到一个特定的队列,接收者从队列中获取消息 。队列保留着消息,直到他们被消费或超时 。
P2P的特点
每个消息只有一个消费者(Consumer)(即一旦被消费 , 消息就不再在消息队列中)
发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行,它不会影响到消息被发送到队列
接收者在成功接收消息之后需向队列应答成功
如果希望发送的每个消息都会被成功处理的话,那么需要P2P模式 。(架构KKQ:466097527,欢迎加入)
4.1.2 Pub/sub模式
包含三个角色主题(Topic) , 发布者(Publisher),订阅者(Subscriber)。多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者 。
Pub/Sub的特点
每个消息可以有多个消费者
发布者和订阅者之间有时间上的依赖性 。针对某个主题(Topic)的订阅者 , 它必须创建一个订阅者之后,才能消费发布者的消息 。
为了消费消息,订阅者必须保持运行的状态 。
为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅 。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息 。
如果希望发送的消息可以不被做任何处理、或者只被一个消息者处理、或者可以被多个消费者处理的话,那么可以采用Pub/Sub模型 。
4.2消息消费
在JMS中,消息的产生和消费都是异步的 。对于消费来说 , JMS的消息者可以通过两种方式来消费消息 。
(1)同步
订阅者或接收者通过receive方法来接收消息,receive方法在接收到消息之前(或超时之前)将一直阻塞;
(2)异步
订阅者或接收者可以注册为一个消息监听器 。当消息到达之后,系统自动调用监听器的onMessage方法 。

推荐阅读