RabbitMQ 入门系列:10、扩展内容:延时队列:延时队列插件及其有限的适用场景(系列大结局)。
延迟队列用于事件发生后间隔一段时间后需要做特定处理的场景,如:
1、电商支付系统中,用户下单后N分钟不支付,自动取消订单。2、用户浏览商品长时间后还没下单,后续推送相关产品和优惠券。3、用户注册或修改生日后:生日短信推送等。4、7天后的自动确认收货等。。。……
对于这类应用,其实用消息队列,对个要求要求,是合适的,但对整个系统应用而言,它是不靠谱的。
消息队列的核心应用,是保持内存的队列,不断的产生并不断的消耗,最佳状态的保持系统的稳定和流畅。
而延迟队列的核心,是积压消息,还是大量积压,这明显与消息队列的设计就不符合。
下面来看看网上官方的延时队列插入:
1、延时队列插件:下载解压与启用
1、下载地址:https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases
2、解压到RabbitMQ安装目录下的plugins目录下
3、启动:命令行运行以下命令:
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
4、重启RabbitMQ:
多了个x-delayed-message则为安装成功。
2、延时队列插件:实现原理
3、延时队列插件:编码实现
其实,队列一直还是那个普通的队列,只是多了一个交换机的类型是延时类型。
因此,原理就是把消息,设置过期时间,发给延时交换机,它自己存着,到时间了,会转发到队列去。
代码如下:
using (var channel = Rabbit.Instance.DefaultConnection.CreateModel()){ //定义队列 channel.QueueDeclare(“dead”); //定义延时路由 IDictionary dic = new Dictionary(); dic.Add(“x-delayed-type”, “direct”); channel.ExchangeDeclare(“ex-dead”, “x-delayed-message”, arguments: dic); channel.QueueBind(“dead”, “ex-dead”, “dead”); var p1 = channel.CreateBasicProperties(); IDictionary header = new Dictionary(); header.Add(“x-delay”, 6000); p1.Headers = header; var p2 = channel.CreateBasicProperties(); IDictionary header2 = new Dictionary(); header2.Add(“x-delay”, 16000); p2.Headers = header2; channel.BasicPublish(“ex-dead”, “dead”, false, p1, Encoding.UTF8.GetBytes(“6秒就过期了1。”)); channel.BasicPublish(“ex-dead”, “dead”, false, p2, Encoding.UTF8.GetBytes(“16秒就过期了2。”));}
运行,等了16秒,终于等来了数据:
4、延时队列插件:适合应用场景如果说,死信队列的适合场景,是短时间的固定间隔时间。那么说,延时队列插件的适合场景,就是更进一步的短时间内的随机时间。
划重点的话,还是取决于积压的数据量。
官方的吐槽说明,目前的设计,由于存储数据库设计不佳,该插件推荐积压数据在100万条数据以下适合应用。
总结:
使用延时队列,应该考量业务积压的数据量,如果数据量小,那么都不是问题。
如果数据量大,那么建立队列数据库,按时间存档要发送的数据,定时扫描处理更合适。
Original: https://www.cnblogs.com/cyq1162/p/16607941.htmlAuthor: 路过秋天Title: RabbitMQ 入门系列:10、扩展内容:延时队列:延时队列插件及其有限的适用场景(系列大结局)。
相关阅读Title: python进行图像边缘检测边缘检测
图像边缘是指图像中表达物体的周围像素灰度发生阶跃变化的那些像素集合。在两个灰度级不同的相邻区域的交界处,必须有一个快速的灰度过渡或跳跃,对应于图像中每个区域的边缘位置,边缘包含着丰富的内部信息,如方向、阶跃属性、形状等,边缘沿线的像素变化平缓,而垂直于边缘的像素变化剧烈。
[En]
At the junction of two adjacent regions with different gray levels, there must be a rapid gray transition or jump, which corresponds to the position of the edges of each region in the image, and the edges contain rich internal information, such as direction, step properties, shape, etc., the pixels along the edge change gently, while the pixels perpendicular to the edge change violently.
图像的大部分信息都集中在边缘部分,边缘确定后实际上就实现了不同区域的分割。
文章目录边缘检测边缘检测算子* –1、Roberts算子2、Prewitt算子3、Sobel算子4、Canny算子5、拉普拉斯算子效果实验* –1、 Roberts边缘检测2、Prewitt 边缘检测3、Sobel边缘检测4、Canny边缘检测5、Laplacian 边缘检测边缘检测算子
求取边缘往往要借助一些边缘检测算子,这些算子有的是基于一阶导数的算子,有的是二阶微分算子
Roberts算子、Prewitt算子、Sobel算子它们包含x、y两个方向的模板,每种模板只对相应的方向敏感,对该方向上的方向有明显的输出,而对其他方向的变化响应不大。以下是一些常见的一阶微分算子及其特点:
算子名称特点简单微分算子对噪声敏感,对噪声具有一定放大作用Roberts算子去噪声作用小,边缘检测能力优于简单微分算子Prewitt算子能够有效抑制噪声的影响,同时能够检测边缘点Sobel算子得到的边缘较宽,噪声抑制效果更强Canny算子检测的边缘位置准确且边缘较窄
1、Roberts算子
; 2、Prewitt算子
3、Sobel算子
Sobel算子检测到的边缘相比于Roberts算子的检测结果要连续一些,并且对于图像的细节检测能力更好,且Sobel边缘检测器引入了局部平均,对噪声的影响比较小,效果较好。
; 4、Canny算子
Canny得到的检测结果优于Roberts、Sobel算子的检测结果,边缘细节更丰富,边缘定位准确连续性较好,虚假边缘少且边缘均具有单像素宽度。其算法实现具体分为以下4步:
用高斯滤波器平滑图像用一阶偏导的有限差分来计算梯度的幅度和方向对梯度幅值进行非极大值抑制用双阈值算法检测和连接边缘5、拉普拉斯算子
常见的二阶微分算子包括拉普拉斯算子,这是一种对图像中的噪声非常敏感的二阶Mentor算子,并且检测到的边缘往往是两个像素宽的,并且没有方向信息。因此,拉普拉斯算子很少被用来直接检测边缘,而主要是在边缘像素已知后,用来确定边缘像素是在图像的暗区还是在亮区。另外,一阶差分算子在较大范围内会形成较大的梯度值,不能准确定位,而二阶差分算子的过零点可以用来精确定位边缘。
[En]
The common second-order differential operator includes Laplace operator, which is a second-order mentor operator, which is very sensitive to noise in the image, and the detected edge is often two-pixel wide and has no direction information. therefore, the Laplace operator is rarely used to detect the edge directly, but is mainly used to determine whether the edge pixel is in the dark area or the bright area of the image after the edge pixel is known. In addition, the first-order difference operator will form a larger gradient value in a wide range, so it can not be located accurately, while the zero-crossing point of the second-order difference operator can be used to accurately locate the edge.
Laplace算子的噪