当前位置:   article > 正文

11.RabbitMQ实战 --- 提升性能,保障安全_mq多个队列提升性能

mq多个队列提升性能

提升性能,保障安全:

  1. 1.对速度的需求
  2. 有很多因素影响rabbitmq投递消息的速度,如硬件和软件的配置。在硬件配置方面,有网络配置,磁盘管理,cpu核心数。在软件级别,你可以配置多个
  3. amqp参数,例如消息持久化,路由算法,绑定数目,以及消息确认策略。
  4. 1.消息持久化
  5. delivery-mode = 1 (非持久化的)
  6. delivery-mode = 2 (持久化的)
  7. 2.消息确认
  8. 加快消息投递的设定 no-ack 标记,如果设置为true,服务器就会在消息发送给客户端后自动将其移除队列。
  9. 3.路由算法和绑定规则
  10. direct,fanout和topic,每种交换器类型代表了服务器实现的特定路由算法。当需要交换器来路由一条消息时,它会根据消息的路由键以及队列与交换器
  11. 之间的绑定来选择队列。由于每种交换器都会区别对待消息路由键,因此队列的选择过程会因为交换器类型的不同而不同。
  12. 在服务器端,交换器和绑定作为记录条目存储在 Mnesia 中。这意味着rabbitmq匹配消息路由键时,它会尝试查找对应路由键的绑定。Mnesia 是一个高性能
  13. 数据库,它的存储是基于erlang的ETS和DETS表的。ETS 指的是erlang Term Storage(Erlang 数据存储),它将数据存储在内存中;而相应的,DETS是一个基于
  14. 磁盘的存储方案。使用普通的ETS函数调用的Mnesia的好处是,Mnesia可以协调在整个集群中对表的访问。举个例子,当你在一个集群节点上创建了交换器,Mnesia
  15. 会负责将该信息复制到集群中的所有其他节点上;而对于添加的绑定,声明队列来说,Mnesia也会这样做。虽然Mnesia在保持一致性方面工作做的很好,但是当你需要
  16. 执行某种类似路由键匹配的查询时会减慢速度。不过,其中的部分过程已经针对direct和fanout类型的交换器做了优化的,所以你不用承受Mnesia为了协调工作而付出
  17. 的代价了。对于该交换器类型来说,绑定存储在 ordered_set 类型的 rabbit_route 表中。根据ETS表的介绍文档,针对这种类型的表格的访问时间与数据库中的
  18. 条目数成对数关系。
  19. direct 和 fanout 交换器
  20. direct 交换器和fanout 之间的差别在于后者在查询 rabbit_route 表时,忽略了路由键。因此,虽然你可以在队列绑定时为fanout交换器提供一个路由键,
  21. 但是在路由消息的时候,该路由键会被忽略。当发布带有路由键的消息发给 fanout 交换器时,该路由键同样会被忽略。
  22. topic 交换器
  23. topic交换器则完全不同。这是因为存储的路由信息更加复杂。由于路由键可以包含以 . 分隔的多个词,所以匹配消息路由键不仅仅是简单字符串匹配。因此,rabbit
  24. 实现了trie数据结构用来存储绑定路由键模式,以支持快速查询。
  25. 4.投递消息
  26. 在交换器找到消息需要路由的目的地之后,它会将目的地列表返回给rabbit_router,并在之后着手将消息的副本投递到每一个目的地(队列或者交换器)。如果发布的
  27. 消息中 mandatory 和 immediate 标记设置为false的话,那么这个过程会以异步的方式执行;并且从客户端的角度看,服务器会变得更快。
  28. 如果消息投递的目的队列是空的并且消费者准备好接收消息的话,那么该消息会直接发送给消费者,而不会结果队列这一步,你应该猜到了,这会极大的提升消息投递速度。
  29. 下一个问题是消费者是否设置了 auto-ack 模式,如果消费者在订阅的时候将 no-ack 设置为true的话,那么服务器会忽略该消息;否则,该消息会被添加到
  30. pending-acknowledgment列表中用来记录消息。下一个问题是该消息是否路由到了持久化对垒上,以及该消息是否以持久化的方式发布。如果确实如此,那么消息会写入
  31. 磁盘,但被标记为已投递。因此当消息暂存队列的时候,它不会被发送给其他消费者。
  32. 现在让我们回到rabbitmq检查队列是否为空的那一刻。如果队列不为空的话,那么该消息就会入队。如果该消息不是持久化的话,那么它会被保存在内存中,当然前提是
  33. 有足够的内存来存放消息。如果内存不足的话,那么消息会被写入磁盘。存放到顺态存储中。如果是持久化消息的话,它们会被写入磁盘,并同时保存在内存中以提升消息
  34. 投递速度。如果发生内存不足,那么消息会被刷到磁盘。
  35. 当消息路由到了持久化队列的时候,如果它需要写入磁盘的话,就会进入持久化存储;否则就会进入瞬态存储。如果rabbit需要重启并回复持久化队列的话,它只需要
  36. 看看持久存储中的内容,同时清除瞬态存储。
  37. 记住,rabbit被优化为尽可能快的向消费者投递消息。如果你定制容量规划并计算消息的进出速率的话,那么你应该尽可能的让队列保持为空。虽然这不是最新发现,但它
  38. 会让你拥有一个快节奏的服务器。但是如果消息者开始滞后,同时队列开始填满的话,之后的某一个时间点,服务器就会收到内存警告,并开始将消息刷到磁盘,而不管当时
  39. 发布消息的时候使用的是什么参数。教训是时时刻刻关注队列大小。
  40. 2.内存使用率和进程限制
  41. 当设计应用程序的时候,你通常有2个基本原则:你选择的技术允许你做什么,以及当前硬件设定允许你做什么。
  42. 1.内存使用率
  43. 当声明队列的时候,rabbit会在不同的Mnesia表里添加多条记录,这取决于队列的类型。如果对垒的声明中durable为true的话,那么就会在表rabbit_queue和
  44. rabbit_duarable_queue 添加队列记录。否则,只会在rabbit_queue中存放记录。以上任何一张表的一条记录都会占用大概29个字的大小。
  45. 根据amqp规范,每个队列都会被绑定到匿名交换机上。这意味着在队列声明之后,rabbit_route表中也会有一条记录来保存队列和交换机之间的绑定。在其他Mnesia
  46. 表中也可能会添加记录。rabbit_route表中的一条记录会占用大概44个字的大小。
  47. 当你声明交换器的时候,差不多也是这样。会在 rabbit_exchange 表中创建一条大约29个字大小的记录。如果是交换器持久化的话,rabbit_durable_exchange上
  48. 也会创建一条记录。
  49. 当队列绑定到 direct 或者 fanout 交换器上的时候,rabbitmq会在至少两张 Mnesia 表上创建条目来记录绑定信息。2张表分别是 rabbit_route和
  50. rabbit_reverse_route。
  51. 2.Erlang 进程计数
  52. 可以在节点启动的时候指定erlang节点上能运行的最大erlang进程数。默认设置为 2^20
  53. erlang 应用程序在整个生命周期中会多次创建并销毁进程。例如,当rabbitmq接收到amqp客户端的tcp连接时,会创建一个erlang进程来管理该连接。同时,会有许多
  54. erlang进程来处理rabbitmq消息存储的逻辑。另外一些进程会监控子进程来确保它们正常运作。超过2^20的话,erlang 会崩溃,rabbit也会崩溃。
  55. rabbitmq的用户会通过以下时间来增加进程数:到服务器的新连接,创建新的信道以及队列声明。新连接4个进程,信道4个进程,队列声明1个进程。
  56. 3.SSL 连接
  57. 1.ssl证书
  58. 2.设置证书颁发机构

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/393639
推荐阅读
相关标签
  

闽ICP备14008679号