第二章 理解消息通信
2.1 消费者与生产者的概念 信道是建立在tcp上的虚拟连接,可以减少tcp连接的开销
2.2 amqp消息路由必须有三部分: 交换器,队列和绑定, 生产者把消息发布到交换器上,消息最终到达队列,绑定决定了消息如何从路由器路由到特定队列.
2.2.1通过amqp的consume命令可以将信道设置为接收模式,直到取消对队列的订阅为止.消费者在消费了最近接收的那条消息后就可以从队列中自动接收下一条消息,如果消息者处理消息,并且需要在消息一到达队列时就自动接收的话,应该使用consume.
2.2.2 如果仅想从队列中获取一条消息,而不是持续订阅,可以使用get命令,该命令在获取消息后会取消订阅,如果想再次获得消息,需要再次调用get命令.如果想要持续获取消息,并实现高吞吐量,应该使用consume.
2.2.2.1 当队列有多个消费者时,消息会被平均分发给所有消费者.
2.2.2.2 消费者在接收到消息后,需要通过ack命令向服务器进行确认,或者在订阅到队列的时候设置auto_ack为true,不确认,则该消息会被重发.
2.2.3 如果在接收到消息后由于某些原因未能正确处理该消息,想要拒收该消息的话,可以通过reject命令,rabbitmq会把消息重新发给下一个订阅的消费者.
2.2.4 通过queue.declare来创建队列,如果消费者在同一信道上订单了另外一个队列 的话,则无法声明队列,必须先取消订阅,将信道设置为传输模式,如果在declare时,不指定队列名称,则rabbitmq会分配一个随机的名称,并在命令中返回.如果声明一个已存在的队列,系统会什么也不做,并成功返回.
2.3. 队列通过路由键绑定到交换器,当把消息发送到服务器时,消息将拥有一个路由键.服务器会根据路由键将消息从交换器路由到队列. 这是php版的绑定代码: $queue->bind($ex->getName(), $routingKey);, 如此看来,交换机也需要一个名字.
2.3.1 交换器有4种类型: direct, fanout, topic, headers.
direct: 一对一类型,一个路由键匹配一个队列,如果路由键匹配的话,消息就被发到指定队列,服务器默认有一个空白字符串名称的交换器,当声明一个队列时,它默认绑定到这个交换器,并以队列名称为路由键.在发送消息时,需要指定路由键.
fanout: 广播模式,一个交换器可以绑定多个队列,每个队列都会收到一份消息.
topic: 允许绑定一个正则模式的路由键,在发送和接收消息时,只要路由键匹配消息携带的标签,就可以接收到消息.
2.4 vhost是一种rabbitmq的最小隔离级别,vhost只与用户相关,不同vhost之间绝对隔离,交换机,路由,队列不互通.通过运行 rabbitmqctl add_vhost [vhost_name] 来创建vhost, rabbitmqctl delete_vhost/list_vhost来删除和查看队列 .
2.5 rabbitmq一重启,所有队列和交换器会全部丢失,因为队列和交换器的durable属性默认是false, 它决定了rammitmq是否需要在重启之后重新创建队列.如何时让消息也幸免于重启? 如果把队列和交换器的durable都设置为true,这还不够,能从服务器重启中恢复的消息,称之为持久化消息,在消息发布时,把delivery_mode设置为2来把消息标记成持久化.而且还要把它发布到持久化的交换器,并到达持久化的队列.
2.6消息持久化的代价是:性能,因为写入磁盘比写入内存要慢很多.而且会减少rabbitmq的吞吐量.
第三章 运行和管理RabbitMQ
3.1 运行: 在sbin 目录 下,运行 rabbitmq-server, 日志: /var/log/rabbitmq目录
关闭: rabbitmqctl stop 会和本地节点通信并指示其干净地关闭
3.1.2 配置文件 : /etc/rabbitmq/rabbitmq.config
3.2 管理用户: rabbitmqctl add_user [name] [password]
rabbitmqctl delete_user [name]
rabbitmqctl list_users
rabbitmqctl change_password [name] [newpassword]
3.2.2 用户只能针对整个vhost进行授权.
rabbitmqctl set_permissions -p [vhost] [user_name] ".*" ".*" ".*" 完全的访问权限
rabbitmqctl clear_permissions -p [vhost] [user_name] 删除权限
rabbitmqctl list_permissions -p [vhost] 列出某vhost的权限表
rabbitmqctl list_user_permissions [user_name] 列出某用户的所有权限
3.3. php的amqp库是 php-amqplib,
rabbitmqctl list_queues 可以列出已声明的队列列表
rabbitmqctl list_queues [field_name] [field_name].... 可以列出更多关于队列的信息
rabbitmqctl list_exchange 可以列出所有交换机和绑定
rabbitmqctl list_exchange [field_name] [field_name] ... 可以列出更多关于队列的信息
rabbitmqctl list_bindings 列出所有的绑定关系
3.3.2 rabbitmq的日志是轮换的,服务器重启后,会重新创建新的日志文件,并在旧文件后面添加一个数字,如rabbit.log.1,如果想手动轮换日志,命令为: rabbitmqctl rotate_logs [suffix] //suffix例: .1
第四章 编码与模式