消息队列

【MQ】Kafka架构与原理

末鹿安然 提交于 2020-02-19 15:15:37
定义 Kafka 是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于 大数据实时处理领域。 使用消息队列的好处 1)解耦 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。 2)可恢复性 系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。 3)缓冲 有助于控制和优化数据流经过系统的速度,解决生产消息和消费消息的处理速度不一致的情况。 4)灵活性 & 峰值处理能力 在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见。 如果为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列 能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。 5)异步通信 很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户 把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要 的时候再去处理它们。 来源: https://www.cnblogs.com/kbian/p/12331239.html

20200219 第 1 章 Kafka 概述

China☆狼群 提交于 2020-02-19 09:31:30
第 1 章 Kafka 概述 1.1 定义 Kafka 是一个 分布式 的基于 发布/订阅模式 的 消息队列 (Message Queue) , 主要应用于 大数据实时处理 领域。 1.2 消息队列 1.2.1 传统消息队列的应用场景 使用消息队列的好处 解耦 可恢复性 缓冲 灵活性 & 峰值处理能力 异步通信 1.2.2 消息队列的两种模式 点对点模式( 一对一 ,消费者主动拉取数据,消息收到后消息清除) 发布/订阅模式( 一对多 ,消费者消费数据之后不会清除消息) 1.3 Kafka 基础架构 Producer : 消息生产者,就是向 kafka broker 发消息的客户端; Consumer : 消息消费者,向 kafka broker 取消息的客户端; Consumer Group (CG): 消费者组,由多个 consumer 组成。 消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费;消费者组之间互不影响。 所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者。 Broker : 一台 kafka 服务器就是一个 broker。一个集群由多个 broker 组成。一个 broker 可以容纳多个 topic。 Topic : 可以理解为一个队列, 生产者和消费者面向的都是一个 topic; Partition: 为了实现扩展性

RabbitMQ | 消息队列模式简介

痴心易碎 提交于 2020-02-19 07:11:49
“Hello World” 简单队列,特点是一个生产者对应一个消费者,就一个生产者P发送消息到queue,一个消费者接收 http://next.rabbitmq.com/tutorials/tutorial-one-java.html “Work queue” 工作队列模式,特点是一个生产者对应多个消费者,多个消费者共同消费一个队列,默认情况下队列循环发送给消费者 http://next.rabbitmq.com/tutorials/tutorial-two-java.html "Publish/Subscribe" 发布/订阅模式,特点是一个生产者对应多个队列及消费者,一个生产者发布的消息会被多个消费者获取。 http://next.rabbitmq.com/tutorials/tutorial-three-java.html 教程包含Publish/Subscribe,Exchanges,Temporary queues,Bindings “Routing” 路由模式, 特点是生产者发送消息到交换机并且要指定路由key,消费者将队列绑定到交换机时需要指定路由key http://next.rabbitmq.com/tutorials/tutorial-four-java.html 教程包含Routing、Bindings “Topics” 通配符模式,

RabbitMQ的应用场景

痴心易碎 提交于 2020-02-19 06:42:34
1.背景 RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue)的开源实现。 2.应用场景 2.1异步处理 场景说明:用户注册后,需要发注册邮件和注册短信,传统的做法有两种1.串行的方式;2.并行的方式 (1)串行方式:将注册信息写入数据库后,发送注册邮件,再发送注册短信,以上三个任务全部完成后才返回给客户端。 这有一个问题是,邮件,短信并不是必须的,它只是一个通知,而这种做法让客户端等待没有必要等待的东西. (2)并行方式:将注册信息写入数据库后,发送邮件的同时,发送短信,以上三个任务完成后,返回给客户端,并行的方式能提高处理的时间。 假设三个业务节点分别使用50ms,串行方式使用时间150ms,并行使用时间100ms。虽然并性已经提高的处理时间,但是,前面说过,邮件和短信对我正常的使用网站没有任何影响,客户端没有必要等着其发送完成才显示注册成功,英爱是写入数据库后就返回. (3)消息队列 引入消息队列后,把发送邮件,短信不是必须的业务逻辑异步处理 由此可以看出,引入消息队列后,用户的响应时间就等于写入数据库的时间+写入消息队列的时间(可以忽略不计),引入消息队列后处理后,响应时间是串行的3倍,是并行的2倍。 2.2 应用解耦 场景:双11是购物狂节,用户下单后,订单系统需要通知库存系统,传统的做法就是订单系统调用库存系统的接口.

RabbitMq客户端开发

巧了我就是萌 提交于 2020-02-18 19:32:43
目录 连接RabbitMQ 使用交换器和队列 exchangeDeclare方法详解 QueueDeclare方法详解 queueBind方法详解 exchangeBind方法详解 何时创建 发送消息 消费消息 推模式 拉模式 消费端的确认与拒绝 关闭连接 连接RabbitMQ 下面的代码(代码清单)用来在给定的参数(IP地址、端口号、用户名、密码等)下 连接RabbitMQ: 也可以选择使用URI的方式来实现 Connection可以用来创建多个Channel实例,但是Channel实例不能在线程间共享, 应用程序应该为每一个线程开辟一个Channel。 某些情况下Channel的操作可以并发运行,但 是在其他情况下会导致在网络上出现错误的通信帧交错,同时也会影响发送方确认(publisher confmn)机制的运行(详细可以参考4.8节),所以 多线程间共享Channel实例是非线程安全的 。 Channel或者Connection中有个isOpen方法可以用来检测其是否已处于开启状态。但并 不推荐在生产环境的代码上使用 isOpen方法,这个方法的返回值依赖于shutdownCause (参考下面的代码)的存在,有可能会产生竞争 ,代码清单是isOpen方法的源码: 错误地使用isOpen方法示例代码如代码清单所示。 通常情况下

消息队列基础

风流意气都作罢 提交于 2020-02-18 02:42:07
什么是消息队列? 就是消息的传输过程中保存消息的容器。 消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能和削峰、降低系统耦合性。 1.异步处理提高系统性能(削峰、减少响应所需要的时间) 不使用消息队列: 在不使用消息队列时,用户的请求数据直接写入数据库,在高并发情况下,数据库的数据剧增,使得响应速度慢。 使用消息队列: 使用了消息队列,用户的请求发送给消息队列后立即返回,再由消息队列的消费者进程从消息队列中获取数据,异步写入数据库。响应速度得到大幅改善 消息队列具有很好的削峰功能-即异步处理功能,将短时间高并发产生的事务消息存储在消息队列中,从而削平高峰期的并发事务。 举例:在电子商务一些秒杀、促销活动中,合理使用消息 队列可以有效抵御促销活动刚开始大量订单涌入对系统的冲击。 因为在请求在发送给消息队列后就返回给用户了,但是请求数据的后续业务校验,写数据库等操作可能失败。因此使用消息队列进行异步处理后,需要适当修改业务流程进行配合。 比如:用户在提交订单之后,订单数据写入消息队列,这个时候不能直接返回用户订单提交成功,需要在消息队列的消费者进程真正处理完该订单,再通过邮件通知用户订单成功。 2.降低系统耦合性 可以使模块直接不直接调用,那么新增模块或者修改模块就对其他模块影响较小,可扩展性更好 消息发送者(生产者)和消息接受者(消费者

springboot消息队列概念

ぐ巨炮叔叔 提交于 2020-02-17 18:42:11
Spring boot之消息队列 一、消息队列 点对点式:唯一的发送者和接受者,接受者不是唯一的,但是一旦消息被消费了,其他接收者就收不到消息 发布订阅式:发布者发布消息,其他人可以订阅这个消息 JMS,java Message Service 消息服务,java api,不跨语言不跨平台 两种消息模型,消息的类型支持的很多 AMQP,网络线协议,可以跨平台,跨语言,提供五种消息模型,消息模型一种 ,因为需要跨平台跨语言,消息需要序列化。 spring支持 spring-jms、spring-rabbit对AMQP的支持; 需要ConnectionFactory的实现来连接消息代理; 提供JmsTemplate、RabbitTemplate来发送消息; @JmsListener(JMS),@RabbitListener(AMQP)注解在方法上监听消息代理发布消息; @EnableJms、@EnableRabbit开启支持 springBoot自动配置 JmsAutoConfiguration 二、RabbitMQ简介 核心: Message: 由消息头和消息体组成,消息体是不透明的,消息头是由一系列的可选属性组成 这些属性包括routing-key(路由键),priority(相对于其他消息的优先权), delivery—mode(支出该消息可能需要持久性存储)等。

ZeroMQ模式

不打扰是莪最后的温柔 提交于 2020-02-17 17:37:28
文章目录 一、相关知识 二、基本套接字 1、REQ-REP模式 2、PUSH-PULL模式 3、PUB-SUB模式 4、DEALER-ROUTER模式 5、PAIR-PAIR模式 结语 一、相关知识 1、基础API接口 创建和销毁套接字:zmq_socket(), zmq_close() 配置和读取套接字选项:zmq_setsockopt(), zmq_getsockopt() 为套接字建立连接:zmq_bind(), zmq_connect() 发送和接收消息:zmq_send(), zmq_recv() 2、ZMQ与TCP的区别 使用多种协议, inproc(进程内) 、 ipc(进程间) 、 tcp 、 pgm(广播) 、 epgm ; 当客户端使用zmq_connect()时连接就已经建立了,并不要求该端点已有某个服务使用zmq_bind()进行了绑定; 连接是异步的,并由一组消息队列做缓冲; 连接会表现出某种消息模式,这是由创建连接的套接字类型决定的; 一个套接字可以有多个输入和输出连接; ZMQ没有提供类似zmq_accept()的函数,因为当套接字绑定至端点时它就自动开始接受连接了; 应用程序无法直接和这些连接打交道,因为它们是被封装在ZMQ底层的。 3、ZMQ核心消息模型 请求-应答模式:将一组服务端和一组客户端相连,用于远程过程调用或任务分发。 发布-订阅模式

linux、uinux消息队列进程通信

徘徊边缘 提交于 2020-02-17 11:25:37
下次打开时候还会残留以前的消息2.没有删除消息队列。 消息队列的基本概念消息队列 也叫做报文队列)Unix系统V版本中3种进程间通信机制之一。另外两种是信号灯和共享内存。这些IPC机制使用共同的授权方法。只有通过系统调用将标志符传送给核心之后,消息队列就是一个消息的链表。就是把消息看作一个记录。进程才干存取这些资源。这种系统IPC对象使用的控制方法和文件系统非常类似。使用对象的引用标志符作为资源表中的索引。 并且这个记录具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以依照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读出消息。 而接收方如果没有收到消息也不需等待。这种通信机制相对简单,Linux采用消息队列的方式来实现消息传送。这种消息的发送方式是发送方不必等待接收方检查它所收到消息就可以继续工作下去。但是应用顺序使用起来就需要使用相对复杂的方式来应付了新的消息总是放在队列的末尾,接收的时候并不总是从头来接收,可以从中间来接收。 只有在内核重起或者显示删除一个消息队列时,消息队列是随内核持续的并和进程相关。该消息队列才会真正被删除。因此系统中记录消息队列的数据结构 structipc_idmsg_id位于内核中,系统中的所有消息队列都可以在结构msg_id中中找到访问入口。 IPC标识符:每一个IPC目标都有一个唯一的IPC标识符

linux进程间通信之消息队列

二次信任 提交于 2020-02-17 11:24:02
http://www.cnblogs.com/magicbox/archive/2012/02/01/2363880.html ========================================================= 一、消息队列的基本概念 消息队列 (也叫做报文队列)是Unix系统V版本中3种进程间通信机制之一。另外两种是 信号量 和 共享存储 。这些IPC机制使用共同的授权方法。只有通过系统调用将标志符传递给核心之后,进程才能存取这些资源。这种系统IPC对象使用的控制方法和文件系统非常类似。使用对象的引用标志符作为资源表中的索引。 消息队列就是一个消息的链表。就是把消息看作一个记录,并且这个记录具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读出消息。 Linux采用消息队列的方式来实现消息传递。这种消息的发送方式是:发送方不必等待接收方检查它所收到的消息就可以继续工作下去,而接收方如果没有收到消息也不需等待。这种通信机制相对简单,但是应用程序使用起来就需要使用相对复杂的方式来应付了。新的消息总是放在队列的末尾,接收的时候并不总是从头来接收,可以从中间来接收。 消息队列是随内核持续的并和进程相关,只有在内核重起或者显示删除一个消息队列时,该消息队列才会真正被删除