消息队列

Invoke and BeginInvoke

两盒软妹~` 提交于 2020-03-24 11:48:46
在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate。 一、为什么Control类提供了Invoke和BeginInvoke机制? 关于这个问题的最主要的原因已经是dotnet程序员众所周知的,我在此费点笔墨再次记录到自己的日志,以便日后提醒一下自己。 1、windows程序消息机制 Windows GUI程序是基于消息机制的,有个主线程维护着一个消息泵。这个消息泵让windows程序生生不息。 Windows GUI程序的消息循环 Windows程序有个消息队列,窗体上的所有消息是这个队列里面消息的最主要来源。这里的while循环使用了GetMessage()这个方法,这是个阻塞方法,也就是队列为空时方法就会被阻塞,从而这个while循环停止运动,这避免了一个程序把cpu无缘无故地耗尽,让其它程序难以得到响应。当然在某些需要cpu最大限度运动的程序里面就可以使用另外的方法,例如某些3d游戏或者及时战略游戏中,一般会使用PeekMessage()这个方法,它不会被windows阻塞,从而保证整个游戏的流畅和比较高的帧速。 这个主线程维护着整个窗体以及上面的子控件。当它得到一个消息,就会调用DispatchMessage方法派遣消息,这会引起对窗体上的窗口过程的调用。窗口过程里面当然是程序员提供的窗体数据更新代码和其它代码。 2

Kafka

China☆狼群 提交于 2020-03-23 18:25:05
Kafka 是一个分布式流式处理平台。 三个关键功能: 消息队列:发布和订阅消息流,这个功能类似于消息队列,这也是 Kafka 也被归类为消息队列的原因。 容错的持久方式存储记录消息流: Kafka 会把消息持久化到磁盘,有效避免了消息丢失的风险·。 流式处理平台: 在消息发布的时候进行处理,Kafka 提供了一个完整的流式处理类库。 Kafka 主要有两大应用场景: 消息队列 :建立实时流数据管道,以可靠地在系统或应用程序之间获取数据。 数据处理: 构建实时的流数据处理程序来转换或处理数据流。 和其他消息队列相比,Kafka的优势 我们现在经常提到 Kafka 的时候就已经默认它是一个非常优秀的消息队列了,我们也会经常拿它给 RocketMQ、RabbitMQ 对比。我觉得 Kafka 相比其他消息队列主要的优势如下: 极致的性能 :基于 Scala 和 Java 语言开发,设计中大量使用了批量处理和异步的思想,最高可以每秒处理千万级别的消息。 生态系统兼容性无可匹敌 :Kafka 与周边生态系统的兼容性是最好的没有之一,尤其在大数据和流计算领域。 队列模型与Kafka 的消息模型 队列模型:早期的消息模型 使用队列(Queue)作为消息通信载体,满足生产者与消费者模式,一条消息只能被一个消费者使用,未被消费的消息在队列中保留直到被消费或超时。 比如:我们生产者发送 100

RabbitMq(7)消息延时推送

做~自己de王妃 提交于 2020-03-23 08:41:57
应用场景 目前常见的应用软件都有消息的延迟推送的影子,应用也极为广泛,例如: 淘宝七天自动确认收货。在我们签收商品后,物流系统会在七天后延时发送一个消息给支付系统,通知支付系统将款打给商家,这个过程持续七天,就是使用了消息中间件的延迟推送功能。 12306 购票支付确认页面。我们在选好票点击确定跳转的页面中往往都会有倒计时,代表着 30 分钟内订单不确认的话将会自动取消订单。其实在下订单那一刻开始购票业务系统就会发送一个延时消息给订单系统,延时30分钟,告诉订单系统订单未完成,如果我们在30分钟内完成了订单,则可以通过逻辑代码判断来忽略掉收到的消息。 在上面两种场景中,如果我们使用下面两种传统解决方案无疑大大降低了系统的整体性能和吞吐量: 使用 redis 给订单设置过期时间,最后通过判断 redis 中是否还有该订单来决定订单是否已经完成。这种解决方案相较于消息的延迟推送性能较低,因为我们知道 redis 都是存储于内存中,我们遇到恶意下单或者刷单的将会给内存带来巨大压力。 使用传统的数据库轮询来判断数据库表中订单的状态,这无疑增加了IO次数,性能极低。 使用 jvm 原生的 DelayQueue ,也是大量占用内存,而且没有持久化策略,系统宕机或者重启都会丢失订单信息。 消息延时推送实现 在 RabbitMQ 3.6.x 之前我们一般采用死信队列+TTL过期时间来实现延迟队列。

大型网站系统架构系列:分布式消息队列(二)

旧时模样 提交于 2020-03-22 03:43:14
四、JMS消息服务 讲消息队列就不得不提JMS 。JMS(JAVA Message Service,java消息服务)API是一个消息服务的标准/规范,允许应用程序组件基于JavaEE平台创建、发送、接收和读取消息。它使分布式通信耦合度更低,消息服务更加可靠以及异步性。 在EJB架构中,有消息bean可以无缝的与JM消息服务集成。在J2EE架构模式中,有消息服务者模式,用于实现消息与应用直接的解耦。 4.1消息模型 在JMS标准中,有两种消息模型P2P(Point to Point),Publish/Subscribe(Pub/Sub)。 4.1.1 P2P模式 P2P模式包含三个角色:消息队列(Queue),发送者(Sender),接收者(Receiver)。每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到他们被消费或超时。 P2P的特点 每个消息只有一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中) 发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行,它不会影响到消息被发送到队列 接收者在成功接收消息之后需向队列应答成功 如果希望发送的每个消息都会被成功处理的话,那么需要P2P模式。(架构KKQ:466097527,欢迎加入) 4.1.2 Pub/sub模式 包含三个角色主题

消息队列rabbitmq

扶醉桌前 提交于 2020-03-22 01:01:02
异步逻辑,在工程,集群中,实现 1 通信解耦 2 消峰限流 系统功能 : 秒杀 , 前台门户网站接收海量并发请求 , 只做消息的发送 ( 生产端 ), 发送到消息队列 . 由消费系统实现消费逻辑 , 将秒杀的用户 / 商品入库 ; 历史 业务系统与认证系统的认证(具有高效,权威的算法机构)通信 Rabbitmq 支持企业级别的消息队列功能;性能极高(并发性能),内部使用erlang语言编写交换机的组件,实现多种使用模式的消息队列; 结构 客户端 :rabbitmq不同的模式,对接的客户端语言不同 角色:生产端,负责发送消息到交换机; 消费端,监听队列,获取队列的消息,进行消费; 核心组件 连接对象:长连接(connection),信道连接(channel) 客户端创建单个长连接,在长连接上频繁使用,销毁短连接 交换机:基于erlang语言开发的,并发语言,程序的运行可以控制线程等cpu资源,实现并发的定义.并发能力超高;交换机需要绑定队列使用;在rabbitmq中存在一个默认的交换机AMQP Default 名字是"",绑定一切队列;生产端只能将消息发送给交换机处理 交换机的类型:topic ( 主题类型 ) ,fanout ( 发布订阅 ) ,direct ( 路由类型 ); AMQP default 类型路由类型; 队列 QUEUE: 实现消息存储 , 被消费的位置的内存组件

Spring集成RabbitMQ-必须知道的几个概念

主宰稳场 提交于 2020-03-22 00:58:14
上篇《Spring集成RabbiMQ-Spring AMQP新特性》我们了解了最新spring-rabbit的2.0.0.M5版本相较于之前有哪些变化。其实使用Spring-amqp确实简单,其主要就一些jar包,比如spring-amqp,spring-rabbit等。这篇就通过几个基本概念来了解下Spring amqp和原生amqp在用法上有何不同。 消息体 在《RabbitMQ入门》系列中,我们如果要发送一条消息,都是转成字节数组的,类似这样 channel.basicPublish("", QUEUE_NAME, null, "hello world".getBytes()); 但是在spring-amqp中,定义了一个消息类,用于存储消息实体和消息的属性信息。下面是该类的成员变量和方法 getBody就是获取消息体的内容,相当于上面的“hello world” getMessageProperties可以得到有关消息本身的属性信息,比如messageId消息的id标识,timestamp时间戳等等的值 使用这将上面属性的值通过setHeader(String key, Object value)方法添加到消息类中 Exchange 读过《RabbitMQ入门》系列,想必对于Exchange应该就不会陌生。在RabbitMQ是实际上所有的消息都不是生产者直接送到消费者

RabbitMQ入门-Routing直连模式

此生再无相见时 提交于 2020-03-22 00:56:17
Hello World模式,告诉我们如何一对一发送和接收消息; Work模式,告诉我们如何多管齐下高效的消费消息; Publish/Subscribe模式,告诉我们如何广播消息 那么有没有灵活强一点的既可以高效消费,又可以同时送达多个消费者的模式? 有,这就是Routing模式,我又称之为Direct直连模式。 Routing模式 一个生产者P,一个交换机X,多个消息队列Q以及多个消费者C 在Exchange和Queue中,我们看到了不同的规则,也就是Routing Key 显然从图中的说明,我们就知道这是一个log日志根据级别派发消息的例子。熟悉Log日志系统的应该都知道,一般的log系统分为error、info、warn和debug等。从图中我们可以看出,将日志级别为error的定向的派发到第一个消息队列,将error、warn和info级别的日志派发到第一个消息队列。 该模型首先实现了定向派发,而不再是订阅模式那种广播式的派发。同一条消息既可以派发给一个Queue,也可以同时派发给两个或者多个Queue,这就是该模式的灵活之处。下面来看看实例 发送端 /** * Created by jackie on 17/8/7. */ public class EmitLogDirect { private static final String EXCHANGE_NAME =

RabbitMQ学习第一记:用java连接RabbitMQ

 ̄綄美尐妖づ 提交于 2020-03-22 00:56:01
1、什么是RabbitMQ    MQ(Message Queue):消息队列,是服务端设计的一个可以存储大量消息的队列,并提供客户端操作队列的方法:生产队列(向队列中添加数据)、消费队列(从队列中取数据)。RabbitMQ就是基于消息队列的一个典型应用。RabbitMQ除了普通的生产消费功能,还有一些高级功能:公平分发 ,轮询分发,路 由模式,通配符模式,发布订阅,队列持久化。 2、java实现 RabbitMQ的连接 2.1、RabbitMQ客户端jar包 <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>4.0.2</version> </dependency> 2.2、java连接RabbitMQ工具类 public class ConnectionUtil { private static Logger logger = Logger.getLogger(ConnectionUtil.class); public static Connection getConnection() { try { Connection connection = null; //定义一个连接工厂 ConnectionFactory factory = new

RabbitMQ安装教程

大城市里の小女人 提交于 2020-03-21 01:26:22
RabbitMQ安装教程(转:http://blog.csdn.net/lu1005287365/article/details/52315786) 简介: RabbitMQ是流行的开源消息队列系统,用erlang语言开发。RabbitMQ是AMQP(高级消息队列协议)的标准实现。 如果不熟悉AMQP,直接看RabbitMQ的文档会比较困难。不过它也只有几个关键概念,这里简单介绍。 安装: 首先需要安装 Erlang环境 官网: http://www.erlang.org/ Windows版下载地址: http://www.erlang.org/download/otp_win64_17.3.exe Linux版: 使用yum安装 Windows安装步骤; 第一步运行: 第二 步: 第三步: 第四步: 第五步: 这样 就安装完了 Erlang 然后就可以安装RabbitMQ了 首先下载RabbitMQ 的Windows版本 下载地址: http://www.rabbitmq.com/ 打开安装程序 按照下面步骤安装: 安装都比较简单 如此就安装完成了 这样就是安装完成后的开始菜单的效果 都是一些工具 然后进入管理工具 运行命令: [plain] view plain copy print ? rabbitmq-plugins enable rabbitmq_management

消息对列入门

最后都变了- 提交于 2020-03-20 23:07:17
消息模式: 1、观察者模式(点对点模式) 消息生产者向消息队列中发送了一个消息之后,只能被一个消费者消费一次 2、发布订阅模式 消息生产者向频道发送一个消息之后,多个消费者可以从该频道订阅到这条消息并消费。 发布与订阅模式和观察者模式有以下不同: 观察者模式中,观察者和主题都知道对方的存在;而在发布与订阅模式中,发布者与订阅者不知道对方的存在,它们之间通过频道进行通信。 观察者模式是同步的,当事件触发时,主题会调用观察者的方法,然后等待方法返回;而发布与订阅模式是异步的,发布者向频道发送一个消息之后,就不需要关心订阅者何时去订阅这个消息,可以立即返回。 二、使用场景 异步处理 发送者将消息发送给消息队列之后,不需要同步等待消息接收者处理完毕,而是立即返回进行其它操作。消息接收者从消息队列中订阅消息之后异步处理。 例如在注册流程中通常需要发送验证邮件来确保注册用户身份的合法性,可以使用消息队列使发送验证邮件的操作异步处理,用户在填写完注册信息之后就可以完成注册,而将发送验证邮件这一消息发送到消息队列中。 只有在业务流程允许异步处理的情况下才能这么做,例如上面的注册流程中,如果要求用户对验证邮件进行点击之后才能完成注册的话,就不能再使用消息队列。 流量削锋 在高并发的场景下,如果短时间有大量的请求到达会压垮服务器。 可以将请求发送到消息队列中