学习内容
- RabbitMQ原理及特性,包括不同类型的exchange,queue的参数意义及性能影响等
- 使用Locust进行压测
- 了解“领域驱动设计”这种模式及其战略模式
已有知识
- 在本地上通过“restful风格的CRUD接口设计”项目在使用 map 存储引擎时使用rabbitmq进行主从同步,但只用到了简单的simple模式
- 学习了ab 与wrk进行压测,但ab在测试时在windows只能get 在linux上只能get put post 但不能delete,wrk在双系统上均可get post put delete
Day1
- 先在本地安装并部署好rabbitmq ,设置test账号以及分配管理员权限
使用rabbitmqctl控制台命令(位于C:\Program Files\RabbitMQ Server\rabbitmq_server-3.6.5\sbin>)来创建用户,密码,绑定权限等。
查看已有用户及用户的角色:
rabbitmqctl.bat list_users
新增一个用户:
rabbitmqctl.bat add_user username password
eric 后面没有“[administrator]”
- (1) 超级管理员(administrator)
可登陆管理控制台(启用management plugin的情况下),可查看所有的信息,并且可以对用户,策略(policy)进行操作。
- (2) 监控者(monitoring)
可登陆管理控制台(启用management plugin的情况下),同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)
- (3) 策略制定者(policymaker)
可登陆管理控制台(启用management plugin的情况下), 同时可以对policy进行管理。
- (4) 普通管理者(management)
仅可登陆管理控制台(启用management plugin的情况下),无法看到节点信息,也无法对策略进行管理。
- (5) 其他的
无法登陆管理控制台,通常就是普通的生产者和消费者。
我们给 eric 变成 “超级管理员” 角色:
rabbitmqctl.bat set_user_tags username administrator
结果:
1.1 部署rabbitmq出现的问题
- erlang与rabbitmq版本不匹配(最好别用最新!!)
https://www.cnblogs.com/vaiyanzi/p/9531607.html 解决方案
找到对应的版本 卸载干净 重新弄
- rabbitmq原理以及特性 具体作用 与其他消息队列的区别以及特点(先说场景再说原理)
- rabbitmq的具体场景
- 异步处理:用户注册后,需要发短信跟邮件,短信跟邮件其实则需要你确认送达后才能继续,只是传递一个消息让你知道一下,
(1)传统方式:将注册信息写入数据库后,发送注册短信,要等短信确认才返回给客户端。 这里的相应时间就是50➕50=100 ,两者其中一个环节崩了都导致无法响应
- 异步处理:用户注册后,需要发短信跟邮件,短信跟邮件其实则需要你确认送达后才能继续,只是传递一个消息让你知道一下,
(2)消息队列:将注册信息写入数据库后,把发送短信跟邮件直接交给消息队列处理,无论以后短信跟游戏耗时多少 是否崩了,都对你后面的流程无影响 所以这里的时间是50+5=50ms
- 应用解耦
场景:双11是购物狂节,用户下单后,订单系统需要通知库存系统,传统的做法就是订单系统调用库存系统的接口. 这种做法有一个缺点:
订单系统和库存系统高耦合. 引入消息队列
订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功。
库存系统:订阅下单的消息,获取下单消息,进行库操作。 就算库存系统出现故障,消息队列也能保证消息的可靠投递,不会导致消息丢失
- 流量削峰 (重要)
秒杀活动,一般会因为流量过大,导致应用挂掉,为了解决这个问题,一般在应用前端加入消息队列。
作用: 1.可以控制活动人数,超过此一定阀值的订单直接丢弃
2.可以缓解短时间的高流量压垮应用(应用程序按自己的最大处理能力获取订单) 1.用户的请求,服务器收到之后,首先写入消息队列,加入消息队列长度超过最大值,则直接抛弃用户请求或跳转到错误页面.
- RabbitMQ的结构图(在simple模式中具体分析)
几个概念说明:
Broker:简单来说就是消息队列服务器实体。
Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
Queue:消息队列载体,每个消息都会被投入到一个或多个队列。
Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
Producer:消息生产者,就是投递消息的程序。
Consumer:消息消费者,就是接受消息的程序。
Channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。
消息队列的使用过程大概如下:
- 客户端连接到消息队列服务器,打开一个channel。
- 客户端声明一个exchange,并设置相关属性。
- 客户端声明一个queue,并设置相关属性。
- 客户端使用routing key,在exchange和queue之间建立好绑定关系。
- 客户端投递消息到exchange。
- exchange接收到消息后,就根据消息的key和已经设置的binding,进行消息路由,将消息投递到一个或多个队列里
- 不同类型exchange
- 不同类型queue