苏州网站建设方案,网络营销推广专员的岗位职责,快速搭建网站 优帮云,房屋设计图片1 MQ简介
1.1 什么是MQ MQ#xff08;Message Queue#xff09;是一种跨进程的通信机制#xff0c;用于传递消息。通俗点说#xff0c;就是一个先进先出的数据结构。 1.2 MQ的应用场景
1.2.1 异步解耦 最常见的一个场景是用户注册后#xff0c;需要发送注册邮件和短信通…1 MQ简介
1.1 什么是MQ MQMessage Queue是一种跨进程的通信机制用于传递消息。通俗点说就是一个先进先出的数据结构。 1.2 MQ的应用场景
1.2.1 异步解耦 最常见的一个场景是用户注册后需要发送注册邮件和短信通知以告知用户注册成功。传统的做法如下 此架构下注册、邮件、短信三个任务全部完成后才返回注册结果到客户端用户才能使用账号登录。但是对于用户来说注册功能实际只需要注册系统存储用户的账户信息后该用户便可以登录而后续的注册短信和邮件不是即时需要关注的步骤。 所以实际当数据写入注册系统后注册系统就可以把其他的操作放入对应的消息队列 MQ 中然后马上返回用户结果由消息队列 MQ 异步地进行这些操作。架构图如下 异步解耦是消息队列 MQ 的主要特点主要目的是减少请求响应时间和解耦。主要的使用场景就是将比较耗时而且不需要即时同步返回结果的操作作为消息放入消息队列。同时由于使用了消息队列MQ只要保证消息格式不变消息的发送方和接收方并不需要彼此联系也不需要受对方的影响即解耦合。
1.2.2 流量削峰 流量削峰也是消息队列 MQ 的常用场景一般在秒杀或团队抢购(高并发)活动中使用广泛。 在秒杀或团队抢购活动中由于用户请求量较大导致流量暴增秒杀的应用在处理如此大量的访问流量后下游的通知系统无法承载海量的调用量甚至会导致系统崩溃等问题而发生漏通知的情况。为解决这些问题可在应用和下游通知系统之间加入消息队列 MQ。
秒杀处理流程如下所述 1用户发起海量秒杀请求到秒杀业务处理系统。 2 秒杀处理系统按照秒杀处理逻辑将满足秒杀条件的请求发送至消息队列 MQ。 3下游的通知系统订阅消息队列 MQ 的秒杀相关消息再将秒杀成功的消息发送到相应用户。 4用户收到秒杀成功的通知。
1.3 常见的MQ产品
目前业界有很多MQ产品比较出名的有下面这些
ZeroMQ 号称最快的消息队列系统尤其针对大吞吐量的需求场景。扩展性好开发比较灵活采用C语言实现实际上只是一个socket库的重新封装如果做为消息队列使用需要开发大量的代码。ZeroMQ仅提供非持久性的队列也就是说如果down机数据将会丢失。RabbitMQ 使用erlang语言开发性能较好适合于企业级的开发。但是不利于做二次开发和维护。ActiveMQ 历史悠久的Apache开源项目。已经在很多产品中得到应用实现了JMS1.1规范可以和spring-jms轻松融合实现了多种协议支持持久化到数据库对队列数较多的情况支持不好。RocketMQ 阿里巴巴的MQ中间件由java语言开发性能非常好能够撑住双十一的大流量而且使用起来很简单。Kafka Kafka是Apache下的一个子项目是一个高性能跨语言分布式Publish/Subscribe消息队列系统相对于ActiveMQ是一个非常轻量级的消息系统除了性能非常好之外还是一个工作良好的分布式系统。
2 RocketMQ入门 RocketMQ是阿里巴巴开源的分布式消息中间件现在是Apache的一个顶级项目。在阿里内部使用非常广泛已经经过了双11这种万亿级的消息流转。
2.1 RocketMQ环境搭建
接下来我们先在linux平台下安装一个RocketMQ的服务
2.1.1 环境准备
下载RocketMQ http://rocketmq.apache.org/release_notes/release-notes-4.4.0/
环境要求
Linux 64位操作系统64bit JDK 1.8
2.1.2 安装RocketMQ
1 上传文件到Linux系统 [rootheima rocketmq]# ls /usr/local/src/ rocketmq-all-4.4.0-bin-release.zip 2 解压到安装目录 [rootheima src]# unzip rocketmq-all-4.4.0-bin-release.zip [rootheima src]# mv rocketmq-all-4.4.0-bin-release ../rocketmq 2.1.3 启动RocketMQ
1切换到安装目录 [rootheima rocketmq]# ls benchmark bin conf lib LICENSE NOTICE README.md 2 启动NameServer [rootheima rocketmq]# nohup ./bin/mqnamesrv [1] 1467 # 只要进程不报错,就应该是启动成功了,可以查看一下日志 [rootheima rocketmq]# tail -f /root/logs/rocketmqlogs/namesrv.log 3 启动Broker # 编辑bin/runbroker.sh 和 bin/runserver.sh文件,修改里面的 # JAVA_OPT${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g # 为JAVA_OPT${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m [rootheima rocketmq]# nohup bin/mqbroker -n localhost:9876 [rootheima rocketmq]# tail -f /root/logs/rocketmqlogs/broker.log 2.1.4 测试RocketMQ
1 测试消息发送 [rootheima rocketmq]# export NAMESRV_ADDRlocalhost:9876 [rootheima rocketmq]# bin/tools.sh org.apache.rocketmq.example.quickstart.Producer 2 测试消息接收 [rootheima rocketmq]# export NAMESRV_ADDRlocalhost:9876 rootheima rocketmq]# bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer 2.1.5 关闭RocketMQ [rootheima rocketmq]# bin/mqshutdown broker [rootheima rocketmq]# bin/mqshutdown namesrv 2.2 RocketMQ的架构及概念 如上图所示整体可以分成4个角色分别是NameServerBrokerProducerConsumer。
Broker(邮递员) Broker是RocketMQ的核心负责消息的接收存储投递等功能NameServer(邮局)消息队列的协调者Broker向它注册路由信息同时Producer和Consumer向其获取路由信息Producer(寄件人)消息的生产者需要从NameServer获取Broker信息然后与Broker建立连接向Broker发送消息Consumer(收件人)消息的消费者需要从NameServer获取Broker信息然后与Broker建立连接从Broker获取消息Topic(地区) 用来区分不同类型的消息发送和接收消息前都需要先创建Topic针对Topic来发送和接收消息Message Queue(邮件)为了提高性能和吞吐量引入了Message Queue一个Topic可以设置一个或多个MessageQueue这样消息就可以并行往各个Message Queue发送消息消费者也可以并行的从多个Message Queue读取消息Message Message 是消息的载体。Producer Group 生产者组简单来说就是多个发送同一类消息的生产者称之为一个生产者组。Consumer Group 消费者组消费同一类消息的多个 consumer 实例组成一个消费者组。
2.3 RocketMQ控制台安装
1 下载 # 在git上下载下面的工程 rocketmq-console-1.0.0 https://github.com/apache/rocketmq-externals/releases 2 修改配置文件 # 修改配置文件 rocketmq-console\src\main\resources\application.properties server.port7777 #项目启动后的端口号 rocketmq.config.namesrvAddr192.168.109.131:9876 #nameserv的地址注意防火墙要开启9876端口 3 打成jar包并启动 # 进入控制台项目将工程打成jar包 mvn clean package -Dmaven.test.skiptrue # 启动控制台 java -jar target/rocketmq-console-ng-1.0.0.jar 4 访问控制台