注意:本章代码基于 第十章 企业项目开发--分布式缓存Redis(2)代码的github地址:https://github.com/zhaojigang/ssmm0 消息队列是分布式系统中实现RPC的一种手段。1、消息队列的基本使用流程假设:我们有这样一个需求,当每注册一 ...
注意:本章代码基于 第十章 企业项目开发--分布式缓存Redis(2)
代码的github地址:https://github.com/zhaojigang/ssmm0
消息队列是分布式系统中实现RPC的一种手段。
1、消息队列的基本使用流程
假设:
- 我们有这样一个需求,当每注册一个admin的之后,就写一条日志log数据到数据库。
分析:
- 在实际中,我们是不会把日志直接写入数据库的,因为日志数据通常是庞大的,而且日志的产生是频繁的,如果我们使用数据库存储日志,哪怕是使用异步存储,也是极耗性能的。在企业中,对于日志的处理方式很多,比较简单的一种是,日志直接产生于nginx或后端服务器(eg.resin),我们写一个定时任务,每隔一段时间,将产生的日志文件使用shell和Python进行正则过滤,取出有用信息,之后进行处理统计,最后将处理后的数据写入数据库。
在这里我们作为演示,,每当注册一个admin的之后,我们异步写一条日志log数据到数据库。
下边的举例也是对代码的解释。
- server1:部署ssmm0-userManagement
- server2:部署ssmm0-rpcWeb
- server3:部署消息队列服务器
当server1执行一个"http://localhost:8080/admin/register?username=canglang25&password=1457890"操作,即向数据库插一条admin信息时,同时将日志log信息写入server3,之后不会等待log信息被server2消费掉就直接返回(异步);
server2循环接收server3中的消息队列中的消息,并将这些log消息写入数据库。
2、消息队列的作用
- 异步
- 解耦:server1(消息生产者服务器)和server3(消息消费者服务器)没有直接联系
- 削峰填谷:当大量请求涌入应用服务器时,应用服务器如果处理不过来,就将这些请求先放入队列,之后再从队列中取出请求慢慢处理(秒杀的一种处理方式)
3、消息队列的两种方式
- P2P
- 消息生产者产生的消息只能由一个消息消费者消费
- 基于队列queue
- 执行流程
- 生产者:创建连接工厂-->创建连接-->启动连接-->创建session-->创建队列,创建生产者,创建消息-->发送消息
- 消费者:创建连接工厂-->创建连接-->启动连接-->创建session-->创建队列,创建消费者-->接收消息
- 发布-订阅
- 消息生产者产生的消息可以由所有订阅了(监听了)该消息的消费者消费
- 基于主题topic
- 执行流程
- 生产者:创建连接工厂-->创建连接-->启动连接-->创建session-->创建topic,创建消息发布者,创建消息-->发布消息
- 消费者:创建连接工厂-->创建连接-->启动连接-->创建session-->创建topic,创建消息订阅者-->消息订阅者通过**接收消息
4、实例(基于P2P实现)
4.1、整体代码结构:
4.2、模块依赖关系
注:箭头的指向就是当前模块所依赖的模块。(eg.rpcWeb依赖data)
- userManagement:用户管理模块--war
- rpcWeb:rpc测试模块(这里用于模拟接收处理消息的应用)--war
- cache:缓存模块--jar
- rpc:rpc模块(包含mq/mina/netty)--jar
- data:数据处理模块--jar
- common:通用工具类模块--jar
4.3、代码
代码整体没变,只列出部分新增代码,完整代码从文首的github进行clone即可。
4.3.1、ssmm0
pom.
<!-- 管理子模块 --> <modules> <module>common</module><!-- 通用类模块 --> <module>cache</module><!-- 缓存模块 --> <module>rpc</module><!-- rpc模块 --> <module>data</module><!-- 封装数据操作 --> <module>userManagement</module><!-- 具体业务1-人员管理系统,这里的userManagement部署在serverA上(配合rpcWeb测试rpc) --> <module>rpcWeb</module><!-- 具体业务2-用于测试RPC的另一台机器,这里的rpcWeb项目部署在serverB上 --> </modules> <!-- 日志:若没有,activemq获取连接报错 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.5.11</version> </dependency>
原标题:第十一章 企业项目开发
关键词:
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。