11.RabbitMQ实战 --- 提升性能,保障安全

提升性能,保障安全:

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.设置证书颁发机构

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值