RabbitMQ实战:高效部署分布式消息队列(读书笔记)

RabbitMQ实战:高效部署分布式消息队列

目录

  • 1 历史简介
  • 2 理解消息通信
  • 3 运行和管理Rabbit
  • 4 编码与模式
  • 5 集群及处理失败
  • 6 故障恢复
  • 7 warren和Shovel:故障转移和复制
  • 8 从Web端管理RabbitMQ
  • 9 使用REST API控制Rabbit
  • 10 监控
  • 11 提升性能,保障安全
  • 12 聪明的Rabbit:扩展RabbitMQ
  • 13 附录

历史简介

理解消息通信

  1. 信道(channel)
  2. 接受者确认之后消息就会从队列中删除(anycast任播?)
  3. AMQP交换器(exchange)和绑定(bind):
    1. 4种类型的交换器:direct(如果key匹配)、fanout(广播)、topic(汇聚,使用*通配符)、headers
      1. 队列绑定到交换器
  4. 多租户:vhost(感觉RabbitMQ完全可以理解为一个HTTP 2.0 Web服务器啊?)
  5. 持久化
    1. durable=true;投递模式选项=2(令人震惊!这什么技术书???)
    2. 性能不佳?靠
    3. ?AMQP事务
      1. 更好的:‘发送方确认模式’(信道设为confirm模式)
  6. Python客户端演示:
    1. import pika
    2. conn_params = ...
    3. conn_broker = pika.BlockingConnection(conn_params)
    4. chan = conn_broker.channel()
    5. chan.exchange_decalre(exachange="name-a", type="direct", passive=False, durable=True, auto_delete=False) #注意名字需要保证唯一性
    6. chan.queue_declcare(queue="q-1")
    7. chan.queue_bind(queue="q-1", exachange="name-a", routing_key="k") #靠
    8. ...
    9. chan.basic_consume(msg_consumer, queue="q-1", consumer_tag=...)
    10. chan.start_consuming()
  7. 当信道为confirm模式时,发送的每条消息都会返回唯一ID(有点类似于数据库插入记录时的生成ID??)
    1. 消息ID需要由发送者自己维护?靠

运行和管理Rabbit

  1. rabbitmq.config:这个配置文件本身就是Erlang代码,还挺时髦的~
  2. Mnesia是一个文档型数据库???
    1. Mnesia会基于主机名创建数据库名称?wtf
  3. php-amqplib
  4. 疑难解答
    1. Erlang cookie
    2. badrpc、nodedown

编码与模式

  1. 发后即忘
    1. 告警日志
    2. 图片缩略图(fanout)
      1. 嗯,php代码是在后台执行的吗?
    3. 用RabbitMQ实现RPC
      1. 其实就是借用了前者的消息序列化代码吧,脑残
    4. 私有队列和发送确认
      1. 怎么保证只有发送者收到确认(机制?),即使指定了reply_to字段和exclusive参数的情况下

我觉得用pipe-filter-lambda的术语来描述分布式消息队列通信似乎更容易理解一点?

集群及处理失败

  1. 内部集群架构
    1. 4种类型的内部元数据:队列、交换器、bind、vhost
  2. 分布式交换器(只不过是一张查询表)
    1. routing_key让我想起了SDN中的内部路由IP地址。。。
  3. 内存节点 or 磁盘节点
    1. 元数据更新必须写到至少一个磁盘节点,内存节点可以认为是磁盘读快照,不能被更新(Me:事实上也是可以的,比如Spark这类基于内存的分布式流处理框架)
  4. 镜像队列(master-slave)和保留消息
    1. 声明镜像队列:传入一个x-ha-policy参数到queue.declare调用中(手工指定master?Fk)

故障恢复

  1. 为Rabbit做负载均衡
    1. HAProxy(不就是一个TCP代理嘛)

warren和Shovel:故障转移和复制

  1. warren:主/备份(无共享)
  2. Shovel:自定义一个RabbitMQ上的队列和另一个RabbitMQ上的交换器的复制关系(异步复制,让我想起了网络传输协议中的ATM。。。)

从Web端管理RabbitMQ

  1. 超越rabbitmqctl:Management插件
    1. CLI

使用REST API控制Rabbit

  1. REST API一般基于HTTP,有连接开销,一般仅用于‘控制’吗?

监控

  1. Nagios

提升性能,保障安全

  1. 消息持久化:delivery-mode=2
  2. topic:11秒时间,针对2000个模式,匹配100000个topic(每秒10w个消息投递?)
  3. Erlang进程计数:上限2^20
  4. SSL连接

聪明的Rabbit:扩展RabbitMQ

  1. STOMP:基于文本的协议(可与ActiveMQ一起工作)
  2. LDAP认证
  3. 自定义交换器:Riak
    1. 靠,这里完全就是Erlang编程了

附录

  1. node-amqp、Rabbit.js

这书太弱了,Fk 

你可能感兴趣的:(rabbitmq,erlang,分布式,消息队列,AMQP)