zoukankan      html  css  js  c++  java
  • rabbitMQ.md

    一、消息中间件概述

    1. 对于一些无需即时返回切耗时的操作提取出来进行异步处理,应用程序建通信方式,大大节省服务器请求响应时间提高系统吞吐量。

    1. 应用场景

    1. 异步处理:如上
    2. 应用解耦合:生产和消费通过mq交互
    3. 削峰填谷:
      chrome_JYCpRh5M35.png

    2. AMQP和JMS

    chrome_g3Uus7sF8n.png
    chrome_g3Uus7sF8n.png

    3. rabbitMQ erlang语言开发基于AMPQ协议

    官网:http://rabbitmq.com

    3-1. 模式

    1. 简单模式
    2. work模式
    3. Publish/Subscribe发布订阅模式
    4. Routing路由模式
    5. Topics主题模式
    6. RPC远程调用模式(不太算MQ)

    二、安装配置rabbitmq

    1. # 安装socat 
    2. yum -y install gcc socat 
    3. # 安装erlang 
    4. rpm -ivh erlang-22.0.7-1.el7.x86_64.rpm 
    5. # 安装rabbitmq 
    6. rpm -ivh rabbitmq-server-3.7.17-1.el7.noarch.rpm 
    7. # 启动管理页面配置 
    8. rabbitmq-plugins enable rabbitmq_management 
    9. ## 配置远程guest登录 
    10. cd /usr/share/doc/rabbitmq-server-3.7.17 
    11. cp rabbitmq.config.example /etc/rabbitmq/rabbitmq.config 
    12. ## 配置文件的双百分号是注释;逗号是换行配置;下处配置打开去掉上百分号和逗号 
    13. {loopback_users,{}} 
    14. # 启动 
    15. ## centos6 
    16. /sbin/service rabbitmq-server restart 
    17. ## centos7 
    18. systemctl restart rabbitmq-server 
    19. # web地址 
    20. localhost:15672 

    1. 用户角色

    超管administrator,监控着monitoring,策略制定这policymaker,普管management,其他

    2. 虚拟主机 virtual hosts:类似mysql的数据库db,数据不互通

    QQPCRealTimeSpeedup_QVBwWCWdGv.png
    QQPCRealTimeSpeedup_QVBwWCWdGv.png

    三、rabbitmq入门

    依赖amqp-clent

    1. 消息生产者

    1-1. 架构

    QQPCRealTimeSpeedup_ZSydromImZ.png
    QQPCRealTimeSpeedup_ZSydromImZ.png

    1-2. 代码

    chrome_nZPlRXUZY0.png
    chrome_nZPlRXUZY0.png

    chrome_Bhg6Jym3R6.png

    1-3. debug

    chrome_mHt3nso7U7.pn
    chrome_mHt3nso7U7.pn

    2. 消息消费者

    chrome_vX9c3H6ySc.png
    chrome_vX9c3H6ySc.png

    QQPCRealTimeSpeedup_kCfFqaHPoy.png
    QQPCRealTimeSpeedup_kCfFqaHPoy.png

    chrome_QaZIoB578C.png
    chrome_M0xgqqUvY2.png

    四、AMQP

    1. 相关概念

    chrome_s4IQsf3fJd.png
    chrome_s4IQsf3fJd.png

    2. rabbitmq运转流程

    QQPCRealTimeSpeedup_G3NZDWqJBq.png
    QQPCRealTimeSpeedup_G3NZDWqJBq.png

    3. 生产者流转过程

    chrome_tonp71X7Uj.png
    chrome_tonp71X7Uj.png

    4. 消费者流转过程

    chrome_1PR3DCX9tc.png
    chrome_1PR3DCX9tc.png

    五、rabbitMQ工作模式

    1. work queue 工作队列模式1生产单队列多消费(默认exchange绑定到默认队列上)

    2. 发布订阅模式:1生成多队列多消费增加了exchage交换机协调多个队列

    交换机类型
    chrome_b0fcDvJguL.png

    • fanout模式绑定的队列们收到的消息同样条数一模一样

    3. 路由模式

    chrome_gKqwveP7P4.png
    chrome_gKqwveP7P4.png

    4. Topics 通配符模式

    topic_exchange需要绑定队列,否则消息会丢失
    QQPCRealTimeSpeedup_knbCbXG4pb.png
    chrome_NC6jMku3tQ.png

    顺序:生产连接-频道-交换机-队列-交换机-频道-消费连接

    六、springboot整合rabbitMQ

    1. 生产者

    • 依赖
      spring-boot-starter-web 使用springmvc进行测试
      spring-boot-starter-amqp mq依赖
      spring-boot-starter-test 单元测试
    • 配置

    1-1. 配置文件

    1. #端口 
    2. server: 
    3. port: 8888 
    4. spring: 
    5. rabbitmq: 
    6. host: localhost 
    7. username: guest 
    8. password: 123456 
    9. virtual-host: /itcast 
    10. port: 5672 

    1-2. 配置类

    chrome_FOi7y8SuHV.png
    chrome_FOi7y8SuHV.png

    1-3. 测试接口

    chrome_oQMqGmTeK5.png
    chrome_oQMqGmTeK5.png

    2. 消费者

    chrome_NcXnX0py3c.png
    chrome_NcXnX0py3c.png

    七、RabbitMQ 高级

    1. 过期时间TTL

    1-1. 队列级设置过期时间

    配置文件
    QQPCRealTimeSpeedup_JAIeLdWJTw.png
    导入配置:启动类加如下注解

    1. @ImportResource("classpath:/spring/spring-rabbitmq-xml") 

    单元测试
    chrome_5ohM8HVwjx.png

    1-2. 消息级别过期时间(针对每一个消息)

    chrome_Gnu0yraR2c.png
    chrome_Gnu0yraR2c.png

    expiration字段单位是微秒,而且是字符串型数字才有效。queue和message两个级别以值小的生效。

    2. 死信队列:不是一个而是一类

    chrome_riC23ZDjeB.png
    chrome_riC23ZDjeB.png

    2-1. 死信队列配置:过期时间,队列里消息长度等处理

    chrome_47GKBa7ZRb.png
    chrome_47GKBa7ZRb.png

    3. 配置文件源码结合消息流程解读

    chrome_uP5YWYTrgo.png
    chrome_uP5YWYTrgo.png

    4. 延迟队列

    延迟时间+死信队列结合实现

    4-1. 使用场景

    QQPCRealTimeSpeedup_dpyUJnoGvi.png
    QQPCRealTimeSpeedup_dpyUJnoGvi.png

    5. 消息确认机制

    确认并且保证消息被送达,提供了两种方式:发布确认和事务(两者不可同时使用)。在channel为事务时不可引入确认模式;同样channel为确认模式时,不可使用事务。

    两种确保消息送达:

    • channel发布确认
    • channel事务

    发布确认两种处理:

    • 消息发送成功确认
    • 消息发送失败回调

    5-1. 确认机制-发布确认配置

    chrome_YhrEqUsDFw.png
    chrome_YhrEqUsDFw.png

    chrome_3Ao6yPPYpC.png

    confirm-callback, return-callback 区别

    chrome_fpUUhPmK8i.png
    chrome_fpUUhPmK8i.png

    测试发送失败

    1. @Test 
    2. public void testFailQueueTest() throws InterruptedException{ 
    3. //exchange 正确,queue错误,confirm被回调,ack=ture,returen被回调,replyText:NO_ROUTE 
    4. //exchange错误 replyText:NOT_FOUND no exchange 
    5. rabbitTemplate.convertAndSend("test_fail_exchange","","测试消息发送失败的确认应答"); 
    6. } 

    5-2. 确认机制-事务支持

    当与发布确认机制同时使用时报

    1. cannot switch from tx to confirm mode 
    2. #解决注释掉以下两句配置 
    3. publisher-confirms="true" 
    4. publisher-returens="true" 

    回滚注解
    chrome_faqE6CnCR8.png

    6. 消息追踪

    QQPCRealTimeSpeedup_4uWrSc2LxN.png
    QQPCRealTimeSpeedup_4uWrSc2LxN.png

    6-1. 消息追踪分析

    Payload就是消息内容
    QQPCRealTimeSpeedup_4GN0OZ2bMi.png

    八、RabbitMQ 集群

    因为Rabbtimq本身基于Erlang编写,该语言天然具备分布式特性(通过同步Erlang集群各节点的magic cookie来实现),因此rmq不需要想amq和kafka需要zk做集群实现HA和元数据保存。

    1. 集群搭建

    1. #停止命令 
    2. rabbitmqctl -n rabbit-1 stop_app 
    1. #两节点集群1为主 
    2. #1. 
    3. #启动1;1的web端口是15672 
    4. RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbit-1 rabbitmq-server start & 
    5. #启动2:2的web端口是15673 
    6. RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" RABBITMQ_NODENAME=rabbit-2 rabbitmq-server start & 
    7. #2操作主节点 
    8. #停止1 
    9. rabbitmqctl -n rabbit-1 stop_app 
    10. #清楚节点历史数据,否则无法将节点加入集群 
    11. rabbitmqctl -n rabbit-1 reset 
    12. #启动应用 
    13. rabbitmqctl -n rabbit-1 start_app 
    14. #3操作从节点 
    15. rabbitmqctl -n rabbit-2 stop_app 
    16. rabbitmqctl -n rabbit-2 reset 
    17. rabbitmqctl -n rabbit-2 join_cluster rabbit-1@'Server-node'#服务器主机名 
    18. rabbitmqctl -n rabbit-1 start_app 
    19. #4验证集群 
    20. rabbitmqctl cluste status -n rabbit-1 

    chrome_7qjkBCrZy4.png
    chrome_7qjkBCrZy4.png

    2. 集群监控

    2-1. 界面监控

    自带web界面弊端

    • 没有告警
    • 无法接入到其他公司的监控系统统一管理(所以一般在小企业小集群中用)

    2-2. 日志监控

    tracing 消息追踪

    2-3. 定制自己的监控系统

    chrome_jROo62E9t8.png
    chrome_jROo62E9t8.png

    开发监控程序:依赖httpclient及jackson的jar
    httpclient,jackon-databind,jackson-annotations,jackon-core

    demo可以百度MonitorRabbitMQ

    2-4. Zabbix监控RabbitMQ

    强大的分布式监视及网络监视企业级开源软件搭建配置要求较高由运维负责

    九、rabbitMQ高可用集群(扩展)

    1. 集群架构模式

    1-1. 主备模式:用于并发少的场景

    QQPCRealTimeSpeedup_pVNxVHx3h9.png
    QQPCRealTimeSpeedup_pVNxVHx3h9.png

    1-2. 远程模式:异地集群同步场景

    QQPCRealTimeSpeedup_YtIAdsltqG.png
    QQPCRealTimeSpeedup_YtIAdsltqG.png

    1-3. 镜像队列模式:HAProxy+keepalive;数据不丢失,高并发

    QQPCRealTimeSpeedup_5f0P3iWE91.png
    QQPCRealTimeSpeedup_5f0P3iWE91.png

    1-4. 多活模式:异地数据复制比远程模式好

    QQPCRealTimeSpeedup_ytHVguIc8x.png
    QQPCRealTimeSpeedup_ytHVguIc8x.png

    2. 镜像队列模式集群搭建

    2-1. 节点规划

    chrome_v19JB6IVjU.png
    chrome_v19JB6IVjU.png

    1. # 复制主节点的erlang.cookie文件到其他所有从节点 
    2. ## 停止mq的运行 
    3. ## 拷贝/var/lib/rabbitmq/.erlang.cookie文件到其他节点 
    4. ## 修改权限 
    5. chmod 400 /var/lib/rabbitmq/.erlang.cookie 
    6. # 停掉所有mq节点然后使用集群方式启动 
    7. ## 主节点 
    8. systemctl stop rabbitmq-server 
    9. systemctl start rabbitmq-server 
    10. ## 从节点如截图 

    QQPCRealTimeSpeedup_9NaAtmC7cp.png
    QQPCRealTimeSpeedup_9NaAtmC7cp.png

    指定镜像队列策略,消息同步验证

    QQPCRealTimeSpeedup_NgXwLc6XZf.png
    QQPCRealTimeSpeedup_NgXwLc6XZf.png

    1. #修改集群名称 
    2. rabbitmqctl set_cluster_name rabbitmq_cd_itcast 
    3. #移除其他节点(在非server2节点上执行移除server2节点) 
    4. rabbitmqctl forget_cluster_node rabbit@server2 
    5. #查看信息 
    6. rabbitmqctl cluster_status 

    2-2. HAProxy实现负载均衡

    2-2-1. 安装

    QQPCRealTimeSpeedup_vi2QKJetlU.png
    QQPCRealTimeSpeedup_vi2QKJetlU.png

    2-2-2. 配置

    1. #cfg配置文件 
    2. #logging options 
    3. global 
    4. log 127.0.0.1 lacal0 info 
    5. maxconn 5120 
    6. #ha的安装地址 
    7. chroot /usr/local/haproxy 
    8. uid 99 
    9. gid 99 
    10. daemon 
    11. quiet 
    12. nbproc 20 
    13. pidfile /var/run/haproxy.pid 
    14. defaults 
    15. log global 
    16. #使用四层代理模式 “mode http”为7层代理模式 
    17. mode tcp 
    18. #if you set mode to tcp.then you mast change tcplog into httplog 
    19. option tcplog 
    20. option dontlognull 
    21. retries 3 
    22. option redispatch 
    23. maxconn 2000 
    24. contimeout 5s 
    25. ## 客户端空闲超时时间为30s,则HA发起重连机制 
    26. clitimemout 30s 
    27. ## 服务端连接超时时间为15s,则HA发起重连机制 
    28. srvtimeout 15s 
    29.  
    30. #front-end IP for consumers and producters 
    31.  
    32. listen rabbitmq_cluster 
    33. bind 192.168.13.104:5672 
    34. #配置tcp模式 
    35. mode tcp 
    36. #balance url_param userid 
    37. #简单的轮询 
    38. balance roundrobin 
    39. #rabbitmq集群节点配置 inter每隔5s集群健康检查2次正确证明服务可用,2次失败证明服务不可用并且配置主备机制 
    40. server server1 192.168.13.101:5672 check inter 5000 rase 2 fail 2 
    41. server server2 192.168.13.102:5672 check inter 5000 rase 2 fail 2 
    42. server server3 192.168.13.103:5672 check inter 5000 rase 2 fail 2 
    43. #配置haproxy web监控,查看统计信息 
    44. listen stats 
    45. bind 192.168.13.104:8100 #注意此处的ip地址我们配置了两台机器 
    46. mode http 
    47. option httplog 
    48. stats enable 
    49. #设者haproxy监控地址为http://192.168.13.104:8100/rabbitmq-stats 
    50. stats uri /rabbitmq-stats 
    51. stats refresh 5s 

    105 haproxy节点的配置跟上述104一致,ip修改成对应ip地址即可

    haproxy监控web效果
    chrome_XJj0H1VhhU.png

    yml里rabbit的配置地址改为haproxy的任一台节点ip地址即可。虽说生产两条一条server1接收一条server2接收,单两个rabbitmq节点会做消息同步

    2-3. Keepalive实现HAProxy的HA高可用集群

    原理VRRP协议:把多台路由设备虚拟成一台对外。

    2-3-1. 安装

    chrome_XI4x7RcFLH.png
    chrome_XI4x7RcFLH.png

    2-3-2. 配置

    chrome_mKLj0pOV5a.png
    chrome_mKLj0pOV5a.png

    配置文件需要的脚本及状态查询

    chrome_uaGtMmAO0J.png
    chrome_uaGtMmAO0J.png

    要测试高可用的虚拟ip的ip漂移功能;对应application.yml的rabbitmq配置ip配置成虚拟ip地址=》对应使用那么多组件加上rabbit还要做节点消息同步,肯定性能有所下降。

    十、rabbitMq 应用与面试

    1. 消息堆积

    堆积的影响-产生堆积的情况-解决办法
    chrome_hRQZIgRURi.png

    1-1. 场景描述及测试代码

    chrome_m0QkBFMeMC.png
    chrome_m0QkBFMeMC.png

    QQPCRealTimeSpeedup_jVah5Q2Gsj.png
    QQPCRealTimeSpeedup_jVah5Q2Gsj.png

    1-2. 性能提升的解决方案(27小时-》0.5小时)

    QQPCRealTimeSpeedup_SiWGS3tv9y.png
    QQPCRealTimeSpeedup_SiWGS3tv9y.png

    2. 消息丢失

    2-1. 保证消息不丢的三块处理

    • 生产者确认
      QQPCRealTimeSpeedup_B2mwTjCS8V.png
      QQPCRealTimeSpeedup_cVomjp9FOH.png
    • 数据持久化
      chrome_lJiRZn0qXs.png
    • 消费者确认
      QQPCRealTimeSpeedup_6u8uSyEPwY.png

    消费者丢失导致消息重发的两种场景:1.消费者主动关闭连接2.消费者挂掉。

    3. 消息有序

    3-1. 乱序场景1:多消费竞争消费

    chrome_icE1PT5KhF.png
    chrome_icE1PT5KhF.png

    场景1解决方案
    chrome_yoCalXftM3.png

    3-2. 乱序场景2:单消费者多线程处理竞争消费

    chrome_oXaF5IL1kh.png
    chrome_oXaF5IL1kh.png

    场景2解决方案:使用java内存队列
    chrome_UAJtsgoGR3.png

    4. 消费ACK未响应导致重发消息重复消费

    如果消费消息的业务是幂等性操作(同一个操作执行多次,结果不变)就算重复消费也没问题,可以不做处理,如果不支持幂等性操作如:下单,减库存,扣款等,那么可以再消费者端每次消费成功后将该条消息id保存到数据库(幂等存储中),每次消费前查询该消息id,如果改消息id已经存在标识已经消费过,就不在消费否则就消费。

    本方案采用redis存储消息id,因为redis单线程的性能也很好,提供很多原子性命令,如setnx命令存储消息id.

    money怎么来?
  • 相关阅读:
    [Matlab] subplot 紧凑,减少空白
    论文
    统计学习理论
    位操作
    Pattern Recognition and Machine Learning
    HDU6862 Hexagon (2020HDU 多校 D8 H)
    VS2008 : error PRJ0002 : 错误的结果 1 (从“d:/Program Files/Microsoft Visual Studio 9.0/VC/bin/cl.exe”返回)
    static简单实例说明其用法(转)
    ArcGIS Engine开发系列:将地图导出为图片的两种方法
    按类别列出的编译器选项
  • 原文地址:https://www.cnblogs.com/bchjazh/p/14518814.html
Copyright © 2011-2022 走看看