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