exchange

「 从0到1学习微服务SpringCloud 」11 补充篇 RabbitMq实现延迟消费和延迟重试

有些话、适合烂在心里 提交于 2020-01-01 14:32:15
Mq的使用中,延迟队列是很多业务都需要用到的,最近我也是刚在项目中用到,就在跟大家讲讲吧。 何为延迟队列? 延迟队列就是进入该队列的消息会被延迟消费的队列。而一般的队列,消息一旦入队了之后就会被消费者马上消费。 业务场景 延迟队列能做什么?最常见的是以下两种场景: 消费 比如:用户生成订单之后,需要过一段时间校验订单的支付状态,如果订单仍未支付则需要及时地关闭订单;用户注册成功之后,需要过一段时间比如一周后校验用户的使用情况,如果发现用户活跃度较低,则发送邮件或者短信来提醒用户使用。 重试 比如消费者从队列里消费消息时失败了,但是想要延迟一段时间后自动重试。 如果不使用延迟队列,那么我们只能通过一个轮询扫描程序去完成。这种方案既不优雅,也不方便做成统一的服务便于开发人员使用。但是使用延迟队列的话,我们就可以轻而易举地完成。 实现思路 在介绍具体思路钱,先介绍RabbitMQ的两个特性:Time-To-Live Extensions(消息存活时间) 和 Dead Letter Exchanges(死信交换机) Time-To-Live Extensions RabbitMQ允许我们为消息或者队列设置TTL(time to live),也就是过期时间。TTL表明了一条消息可在队列中存活的最大时间,单位为毫秒。当某条消息被设置了TTL或者当某条消息进入了设置了TTL的队列时

死信队列+TTL实现延迟重试

依然范特西╮ 提交于 2019-12-31 02:05:58
思路 MQ配置: 1.设置正常处理队列及绑定关系,exchange,queue,key 2.创建5s延迟队列queue_5s,10s延迟队列queue_10s,20s延迟队列queue_20s,差错处理队列queue_error,分别于exchange_delay绑定,设置routingKey分别为key_5s,key_10s,key_20s,key_error 3.分别配置queue_5s,queue_10s,queue_20s的死信交换机为exchange,routingKey为key 代码实现: 1.消息发送方正常投递消息到exchange —> key(正常发送) 2.消息处理方式正常处理消息 3.消息处理方异常,则计算routingKey,进行投递(可以将重试次数放入message head 或者直接使用message 的routingKey) 4.若消息投递到queue_*s中,则过期后自动转到 exchange —> key 到达 queue 5.若消息投递到queue_error,则进行异常处理(报警或者其他之类) 此处亦可以使用单通道queue_delay,过期时间设置在消息message上,通道不设置过期,如下 新版本的rabbitMQ,安装了插件rabbitmq_delayed_message_exchange后,可直接设置延迟投递,如下 来源: CSDN

RabbitMQ之发布订阅

北城以北 提交于 2019-12-29 05:51:55
工作队列中,每个任务之分发给一个工作者。如果需要分发一个消息给多个消费者,这种模式被称为“发布/订阅” 交换器(Exchanges) RabbitMQ完整的消息模型 发布者(producer)是发布消息的应用程序 队列(queue)用于消息存储的缓冲 消费者(consumer)是接收消息的应用程序 RabbitMQ消息模型的核心理念是: 发布者(producer)不会直接发送任何消息给队列。事实上,发布者(producer)甚至不知道消息是否已经被投递到队列。 发布者(producer)只需要把消息发送给一个交换器(exchage),然后由它一边从发布者接收消息,一边把消息推入队列。交换器必须知道如何处理它接收到的消息,是应该推送到指定的队列还是多个队列,或者直接忽略消息。这些规则通过exchange type来定义。 交换器类型 1、direct 处理路由键,需要将一个队列绑定到交换机上,要求该消息与一个特定的路由键完全匹配。 是完整的匹配,与routing_key对应。 2、topic 将路由键和某模式进行匹配。此时队列需要绑定在一个模式上。 符号#匹配一个或多个词,符号*匹配不多不少一个词。 例如audit.#能够匹配到audit.irs.corportate,但是audit.*只会匹配audit.irs 类似消息归类 注:多台服务器访问同一个队列时

冒泡排序

别说谁变了你拦得住时间么 提交于 2019-12-28 11:28:09
冒泡排序: 算法步骤: 1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。 2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完 后,最后的元素会是最大的数。 3.针对所有的元素重复以上的步骤,除了最后一个。 4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 # include <iostream> using namespace std ; void bubbleSort ( int r [ ] ) { int exchange = 6 ; int a ; while ( exchange ) { a = exchange ; exchange = 0 ; for ( int j = 1 ; j < a ; j ++ ) { if ( r [ j ] > r [ j + 1 ] ) { r [ 0 ] = r [ j ] ; r [ j ] = r [ j + 1 ] ; r [ j + 1 ] = r [ 0 ] ; exchange = j ; } } } } int main ( ) { int r [ ] = { 0 , 15 , 28 , 32 , 25 , 18 , 16 } ; bubbleSort ( r ) ; for ( int i = 1 ; i <= 6 ; i ++ ) cout << r [ i ]

基于 RabbitMQ 的实时消息推送

两盒软妹~` 提交于 2019-12-28 04:27:55
基于 RabbitMQ 的实时消息推送 俞 超 2016 年 4 月 11 日发布 Weibo Google+ 用电子邮件发送本页面 2 实现服务器端推送的几种方式 Web 应用都是基于 HTTP 协议的请求/响应模式,无法像 TCP 协议那样保持长连接,因此 Web 应用就很难像手机那样实现实时的消息推送。就目前来看,Web 应用的消息推送方式主要有以下几种: 1.Ajax 短轮询 Ajax 轮询主要通过页面端的 JS 定时异步刷新任务来实现数据的加载,但这种方式实时效果较差,而且对服务端的压力也较大。 2. 长轮询 长轮询主要也是通过 Ajax 机制,但区别于传统的 Ajax 应用,长轮询的服务器端会在没有数据时阻塞请求直到有新的数据产生或者请求超时才返回,之后客户端再重新建立连接获取数据,具体实现方式见图 1 所示。但长轮询服务端会长时间地占用资源,如果消息频繁发送的话会给服务端带来较大的压力。 图 1. 长轮询实现方式 3.WebSocket 双向通信 WebSocket 是 HTML5 中一种新的通信协议,能够实现浏览器与服务器之间全双工通信。如果浏览器和服务端都支持 WebSocket 协议的话,该方式实现的消息推送无疑是最高效、简洁的。并且最新版本的 IE、Firefox、Chrome 等浏览器都已经支持 WebSocket 协议,Apache Tomcat 7.0

Celery 分布式任务队列

一世执手 提交于 2019-12-25 18:17:54
一、Celery介绍和基本使用 Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery, 举几个实例场景中可用的例子: 你想对100台机器执行一条批量命令,可能会花很长时间 ,但你不想让你的程序等着结果返回,而是给你返回 一个任务ID,你过一段时间只需要拿着这个任务id就可以拿到任务执行结果, 在任务执行ing进行时,你可以继续做其它的事情。 你想做一个定时任务,比如每天检测一下你们所有客户的资料,如果发现今天 是客户的生日,就给他发个短信祝福 Celery 在执行任务时需要通过一个消息中间件来接收和发送任务消息,以及存储任务结果, 一般使用rabbitMQ or Redis,后面会讲 1.1 Celery有以下优点: 简单:一单熟悉了celery的工作流程后,配置和使用还是比较简单的 高可用:当任务执行失败或执行过程中发生连接中断,celery 会自动尝试重新执行任务 快速:一个单进程的celery每分钟可处理上百万个任务 灵活: 几乎celery的各个组件都可以被扩展及自定制 Celery基本工作流程图 1.2 Celery安装使用 Celery的默认broker是RabbitMQ, 仅需配置一行就可以 broker_url = 'amqp://guest

FYI: Getting Started with WebDAV

天涯浪子 提交于 2019-12-25 05:10:30
FYI: Getting Started with WebDAV WebDAV is a protocol, not an API. It is an extension of HTTP and provides more request methods to allow us to get information out of Exchange and change information within it. Here are some WebDAV samples on MSDN... 310283 How to retrieve and to modify properties on items by using WebDAV in Visual C# .NET http://support.microsoft.com/default.aspx?scid=kb;EN-US;310283 308373 How to send a meeting request by using WebDAV http://support.microsoft.com/default.aspx?scid=kb;EN-US;308373 296126 How to create, modify, and delete contact items by using WebDAV (PROPPATCH

Currency Exchange POJ - 1860 (spfa判断正环)

旧时模样 提交于 2019-12-24 23:40:00
Several currency exchange points are working in our city. Let us suppose that each point specializes in two particular currencies and performs exchange operations only with these currencies. There can be several points specializing in the same pair of currencies. Each point has its own exchange rates, exchange rate of A to B is the quantity of B you get for 1A. Also each exchange point has some commission, the sum you have to pay for your exchange operation. Commission is always collected in source currency. For example, if you want to exchange 100 US Dollars into Russian Rubles at the

RabbitMQ官方中文入门教程(PHP版) 第三部分:发布/订阅(Publish/Subscribe)

半世苍凉 提交于 2019-12-24 18:20:01
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 发布/订阅 在上篇教程中,我们搭建了一个工作队列。每个任务之分发给一个工作者(worker)。在本篇教程中,我们要做的之前完全不一样——分发一个消息给多个消费者(consumers)。这种模式被称为“发布/订阅”。 为了描述这种模式,我们将会构建一个简单的日志系统。它包括两个程序——第一个程序负责发送日志消息,第二个程序负责获取消息并输出内容。 在我们的这个日志系统中,所有正在运行的接收方程序都会接受消息。我们用其中一个接收者(receiver)把日志写入硬盘中,另外一个接受者(receiver)把日志输出到屏幕上。 最终,日志消息被广播给所有的接受者(receivers)。 交换器(Exchanges) 前面的教程,我们发送消息到队列并从中取出消息。现在是时候介绍RabbitMq中完整的消息模型了。 让我们简单的概括一下之前的教程: 发布者(producer) 是发布消息的应用程序。 队列(queue) 用于消息存储的缓冲。 消费者(consumer) 是接收消息的应用程序。 RabbitMQ消息模型的核心理念是:发布者(producer)不会直接发送任何消息给队列。事实上,发布者(producer)甚至不知道消息是否已经被投递到队列。 发布者(producer)只需要把消息发送给一个 交换器

Springboot整合rabbitMq

喜你入骨 提交于 2019-12-23 20:59:45
该篇文章内容较多,包括有rabbitMq相关的一些简单理论介绍,provider消息推送实例,consumer消息消费实例,Direct、Topic、Fanout的使用,消息回调、手动确认等。 (但是关于rabbitMq的安装,就不介绍了) 在安装完rabbitMq后,输入http://ip:15672/ ,是可以看到一个简单后台管理界面的。 在这个界面里面我们可以做些什么? 可以手动创建虚拟host,创建用户,分配权限,创建交换机,创建队列等等,还有查看队列消息,消费效率,推送效率等等。 以上这些管理界面的操作在这篇暂时不做扩展描述,我想着重后面实例里会使用到。 首先先介绍一个简单的一个消息推送到接收的流程,提供一个简单的图: RabbitMq -JCccc黄色的圈圈就是我们的消息推送服务,将消息推送到 中间方框里面也就是 rabbitMq的服务器,然后经过服务器里面的交换机、队列等各种关系(后面会详细讲)将数据处理入列后,最终右边的蓝色圈圈消费者获取对应监听的消息。 常用的交换机有以下三种,因为消费者是从队列获取信息的,队列是绑定交换机的(一般),所以对应的消息推送/接收模式也会有以下几种: Direct Exchange 直连型交换机,根据消息携带的路由键将消息投递给对应队列。 大致流程,有一个队列绑定到一个直连交换机上,同时赋予一个路由键 routing key 。