关于rabbitmq:rabbitmq学习整理

15次阅读

共计 3752 个字符,预计需要花费 10 分钟才能阅读完成。

本篇文章次要是对《Rabbitmq 实战》这本书的关键点做一些总结和整顿,另外再加一些网上整顿的扩大知识点。这里我截了一张图,不便辨认

知识点

什么是 Rabbitmq
各个角色
多租户模式
如何做长久化
集群模式
其余重要点

什么是 Rabbitmq

简略的说就是一个用 erlang 编写的基于 AMQP 协定通信的音讯队列中间件,通过它可能做到程序之间通信的解耦、流控,可能做到对音讯的长久化,保障在通信过程中呈现宕机等状况下音讯不失落。
如何装置见我另一篇文章《Rabbitmq 装置部署》

各个角色

  • 生产者
  • 消费者
  • 信道 / 队列 / 交换器 / 绑定

    生产者

    生产者就是生产音讯的一方,生产者创立完音讯之后,将音讯发送到 rabbitmq。这里波及到音讯定义,音讯次要有两局部形成:数据和标签。数据就是咱们平时要发送给消费者的内容,标签次要是为了让 rabbitmq 晓得音讯的特色、要发送给谁。音讯发后即忘。

    消费者

    消费者就是连贯到 rabbitmq 上,并订阅某个队列,期待接管该队列的音讯或者能够被动去拉取该队列的音讯。音讯的生产波及到推和拉两种模式,上面是两种模式的介绍

  • 推模式(举荐):
    1、channel.basicConsume(queneName,consumer)办法将信道 (channel) 设置成投递模式,直到勾销队列的订阅为止;在投递模式期间,当音讯达到 RabbitMQ 时,RabbitMQ 会主动地、一直地投递音讯给匹配的消费者,而不须要生产端手动来拉取,当然投递音讯的个数还是会受到 channel.basicQos 的限度。
    2、推模式将音讯提前推送给消费者,消费者必须设置一个缓冲区缓存这些音讯。长处是消费者总是有一堆在内存中待处理的音讯,所以当真正去生产音讯时效率很高。毛病就是缓冲区可能会溢出。
    3、因为推模式是信息达到 RabbitMQ 后,就会立刻被投递给匹配的消费者,所以实时性十分好,消费者能及时失去最新的音讯。
  • 拉模式:
    1、如果只想从队列中获取单条音讯而不是继续订阅,则能够应用 channel.basicGet 办法来进行生产音讯。
    2、拉模式在消费者须要时才去消息中间件拉取音讯,这段网络开销会明显增加音讯提早,升高零碎吞吐量。
    3、因为拉模式须要消费者手动去 RabbitMQ 中拉取音讯,所以实时性较差;消费者难以获取实时音讯,具体什么时候能拿到新音讯齐全取决于消费者什么时候去拉取音讯。

    信道 / 队列 / 交换器 / 绑定

    信道

    连贯到 mq 之后,在通信之前会首先创立一个信道(channel),他是基于 Tcp 连贯内的虚构连贯,能够复用一条 Tcp 连贯,从而缩小 Tcp 连贯的创立和销毁老本,每条信道都会有一个 id,咱们和 rabbitmq 的所有交互都是通过信道实现的。ps:这里信道是如何实现共享一个 tcp 连贯并且可能不影响吞吐率的须要再钻研一下。

    队列

    队列比较简单,就是一个寄存了一组音讯的数据结构,FIFO 模式,生产者创立的音讯最终就是被 mq 放到队列里去了,消费者也是最终通过队列获取到音讯再进行生产,如果是多个消费者订阅一个队列的状况下,其中一个消费者生产胜利了,音讯就会从队列中被删除,音讯失败的话音讯就会被传递给下一个消费者 (requeue 设置为 true)。当然 mq 的队列也有一些简单点的应用,包含死信队列和优先级队列。
    死信队列:当音讯没有被胜利生产咱们就能够把它丢入到死信队列中,哪些场景算没有胜利呢?
    1、音讯过期,也就是给音讯或者队列设置了 TTL 工夫;
    2、音讯被回绝,也就是音讯 basic.reject 或者 basic.nack,并且 reququq=false;
    3、队列达到最大长度;
    对以上这三种音讯成为死信音讯之后,咱们能够通过创立死信交换器,将死信音讯丢入到指定的队列中,这个队列就能够称之为死信队列,对于死信队列更具体的介绍,参考 https://www.jianshu.com/p/986…。
    另外一个就是咱们能够基于音讯的优先程序创立优先级队列,如何创立优先级队列,参考 https://blog.csdn.net/u013256…
    另外比拟有用的两个设置参数,这里截取书上一段话:

    交换器

    交换器能够了解为一个路由器,生产者在发送音讯之后,mq 会基于交换器的路由键(routing key)将音讯丢入对应的队列中去。类型有:direct、fanout、topic、headers。对于四种类型的具体形容,参考 https://www.jianshu.com/p/469…。(headers 曾经被淘汰,被 direct 取代)

    绑定

    绑定比较简单,就是通过 routing key 将交换器和队列进行关联起来,使得音讯通过交换器之后能被发送到对应的队列里。

    多租户模式

    每个 rabbitmq 服务器都能创立虚构音讯服务器,这就是虚拟主机(vhost)。vhost 能够了解为一个 mini 版的 rabbitmq 服务器,它也有本人的队列、交换器、绑定等角色,还有本人的一套权限管制。比方你能够用同一个 rabbitmq 别离创立测试环境、开发环境、生产环境的 vhost,达到不同环境隔离的目标,而不必启动多个 rabbitmq 服务器。咱们能够用 rabbitmqctl 去保护 vhost,当然也能够通过 web 管理工具进行保护,参考:https://www.cnblogs.com/max19…

    如何做长久化

    咱们在音讯通信的时候有时须要保障音讯不会失落,即便是零碎挂了,音讯仍然可能保留,这里就要说到音讯的长久化。默认状况下,rabbitmq 重启之后,队列、交换器都是会隐没的,当然隐没的也包含外面的音讯。如何能做到不失落呢?

  • 要长久化队列和交换器,设置其 durable 为 true。
  • 次在音讯公布的时候将投递模式(delivery_mode)设置为 2,并通过上一步设置的长久化交换器公布到长久化队列外面。
    rabbitmq 长久化音讯是写入到磁盘上的一个长久化日志文件里,写入胜利之后才会响应生产端胜利,后续如果该音讯被发到非长久化队列里,就会从持久性日志里移除。具体的长久化代码怎么写,参考:https://www.cnblogs.com/bigbe…

    问题

    长久化保障了咱们的音讯不失落,同时也会带来一些问题,最次要的问题就是性能,因为它是写日志文件是波及到磁盘交互的。另外在集群模式下会有一些问题,因为默认的状况下,集群中每个节点都是各自保护本人的音讯队列,也就是其中一个节点宕机了,在其复原前,该节点内的音讯就无奈被生产了。
    总得来说应用长久化机制要进行衡量思考。

    集群模式

    平时咱们在应用 rabbitmq 的时候,万一 rabbitmq 挂了怎么办,连带咱们的相干服务业务不就有影响了。这时候咱们就须要对 rabbitmq 做高可用,也就是部署 rabbitmq 集群。
    集群模式下,每个节点也能够抉择将元数据信息存入到磁盘或者内存中,这就是咱们看到 DISK 节点和 RAM 节点。默认状况下每个节点的队列都是各自保护的,也就是其中一个节点如果宕机了,那就意味着该节点所有队列中的所有音讯都临时隐没了,直到复原该节点。这时候你们可能曾经意识到问题了,这样的话那如何能保障其中一个节点挂了,音讯仍然失常解决呢?
    这里就波及到镜像队列的概念了,通过镜像队列,咱们就能够将节点的音讯都同步到其余节点。当然咱们还得做长久化,所有在集群模式下必须要有 DISK 节点来保障长久化。这里又波及到衡量取舍了,尽管保障了高可用,然而性能和存储空间方面又会受到影响,如果你的业务场景是不须要常常创立队列的,DISK 节点影响就不大。
    失常集群搭建中,咱们须要保障有至多 2 个 DISK 节点来做长久化,另外 RAM 节点的效率是要高于 DISK 节点的,交互上能够和 RAM 节点交互。
    如何搭建,参考:https://blog.csdn.net/qq_2853…

    其余重要点

    其余的重要点这里就是毫无逻辑的整顿了一下,大略晓得有这些点就能够了

  • erlang 也有虚拟机,虚拟机上每个实例称为节点,erlang 一个节点能够运行多个 erlang 应用程序,节点之间能够做本地通信(不论是否在同一台服务器上)。erlang 上的应用程序解体了,erlang 会主动尝试重启。
  • 日志目录在:/var/log/rabbitmq,能够以 -detached 形式以守护过程形式后盾启动。
  • 以 stop 命令洁净地进行敞开,避免音讯没解决完失落,rabbitmqctl 治理操作参考 https://www.cnblogs.com/wyt00…。
  • 通过对 rabbitmq.config 配置扭转监听端口以及占用的内存等信息,不存在这个文件本人新增一个。具体配置参考:https://www.cnblogs.com/wyt00…。
  • 应用 mnesia 数据库, 他是非关系型
  • rpc 模式实现参考:https://blog.csdn.net/u013256…
  • 通过 haproxy 实现负载平衡,参考 https://www.cnblogs.com/Liang…
  • 提早队列实现,参考 https://www.cnblogs.com/mfran…

    总结

    因为知识点切实有点多,前面就做了一些简略的整顿,还须要本人多去操作能力相熟,文章记录只是作为疾速回顾。以上也只是本人的了解,有什么问题大家也能够提出来一起探讨。

正文完
 0