跳至主要內容

RabbitMQ

酷风大约 3 分钟

RabbitMQ

介绍

  • 2007年,Rabbit技术公司基于AMQP标准开发的RabbitMQ 1.0 发布

  • 采用Erlang语言开发

    • Erlang 语言专门为开发高并发和分布式系统的一种语言
  • 接受、存储和转发二进制数据消息。accepts, stores, and forwards binary blobs of data ‒ messages.

    1. 生产者: 发送消息的程序, Producing
    2. 消费者: 等待接收消息的程序, Consuming
    3. 队列: 一个大的消息缓冲区, 只受主机的内存和磁盘限制
  • P 生产者

  • 队列

  • C 消费者

模式

Hello World 简单模式

  • 仅作消息代理,单生产者,单消费者;

Work Queues 工作队列模式

  • 单生产者, 多个消费者同时并行处理;

Publish/Subscribe 发布订阅模式

  • 单生产者,多消费者,多队列。

Routing 路由模式

  • 根据Routing Key有选择地接收消息;
  • 多消费者,选择性多队列,每个队列通过routing key全文匹配。

Topics 主题模式

  • 主题交换机方式接收消息,将routing key和模式进行匹配。
  • 多消费者,选择性多队列,每个队列通过模式匹配。

队列需要绑定在一个模式上。
#匹配一个词或多个词,*只匹配一个词。

RPC 远程过程调用

  • Remote procedure call (RPC)
  • 在远程计算机上运行功能并等待结果。

Publisher Confirms 发布者确认

  • 与发布者进行可靠的发布确认,发布者确认是RabbitMQ扩展,可以实现可靠的发布。
  • 适用于消息可靠性要求较高

主题模式 TopicExchange

安装

  • 安装erlang

  • 安装RabbitMQ

    • rpm -ivh rabbitmq-server-3.8.8-1.el7.noarch.rpm
    • 出现警告和一个错误。警告是缺少key,而错误是socat,只需要导入key和安装socat即可。
      • 1)导入key:rpm --import https://www.rabbitmq.com/rabbitmq-release-signing-key.asc
      • 2)安装socat
      • yum -y install epel-release
      • yum -y install socat
  • 注意:yum方式安装会自动创建一个启动rabbitmq的账户 rabbitmq

cat /etc/password
rabbitmq:x:598:499:RabbitMQ messaging server:/var/lib/rabbitmq:/sbin/nologin

  • 启用管理平台插件,启用插件后,可以可视化管理RabbitMQ。
   rabbitmq-plugins enable rabbitmq_management
   
   
   rabbitmq-plugins enable rabbitmq_federation
   rabbitmq-plugins enable rabbitmq_federation_management
  • 启动RabbitMQ
systemctl start rabbitmq-server.service
systemctl enable rabbitmq-server.service
systemctl status rabbitmq-server.service
  • 访问控制台界面???

高可用

  • 集群实现

    • 默认集群
      • 一般在局域网中使用
      • 各节点版本相同
    • 使用插件:无需建立集群,广域网中使用
      • 各节点版本可以不同
      • Federation
      • Shovel
  • 默认集群:各节点只有原数据,消息五冗余

    • 前置配置
      • 关掉防火墙
      • ssh免登录
      • rabbitmq账号(yum略)
    1. 安装各节点服务
    2. 配置各节点 hosts
    3. erlang.cookie 各节点一致
    4. 设置集群节点
  • 镜像集群:高可用,镜像队列模式,节点之间不仅仅会同步元数据,消息内容也会在镜像节点间同步

    • 性能损耗
    • 扩展性差
  • 集群关闭启动

    • 最后关闭的那个节点是第一个启动的
      • 如果第一个启动的不是最后关闭的节点,那么这个节点会等待最后那个关闭的节点启动。这个等待时间默认为30s,默认会重试10次。如果10次之后,还未等到最后关闭的节点启动,则当前节点也会因失败而关闭自身的应用。(可以通过查看rabbit的日志来查看)
    • 集体挂掉
      • 所有node都认为自己并不是最后一个关闭的
      • 各node上尝试重启,最终都会失败
      • 措施命令:rabbitmqctl force_boot
        • 无条件的启动节点,可能会造成数据lost
    • 最后关闭的node最终无法启动
      • 将该node从集群中剔除:rabbitmqctl forget_cluster_node --offline
  • 高可用方案

    • Federation 配置,集群双向同步 ,如双机房备份
    • 镜像集群 + Haproxy + keepalived