消息队列

RabbitMQ - Spring Boot

江枫思渺然 提交于 2020-02-02 04:03:16
文章目录 Introduction RabbitMQ Work Mode Direct -- 路由模式 RabbitMQ direct producer application.properties pom.xml DirectRabbitConfig.java SendMessageController.java Console Output RabbitMQ direct consumer application.properties pom.xml DirectReceiver.java Console Output Fanout -- 发布/订阅模式 Fanout Producer FanoutRabbitConfig.java SendMessageController.java application.properties pom.xml Console Output Fanout Consumer FanoutReceiverA.java FanoutReceiverB.java FanoutReceiverC.java application.properties pom.xml Console Output Topic -- 匹配订阅模式 Publisher application.properties pom.xml TopicRabbitConfig

Kafka面试必知必会

别等时光非礼了梦想. 提交于 2020-02-02 00:17:13
前置知识: Kafka消息队列理解 Kafka发送消息和读取消息 1. 为什么使用消息队列? 解耦 异步 削峰 面试时要结合自己项目中的业务场景回答, 而不是直接背诵概念, 如果面试官没有问到这些问题, 我们可以主动提出聊聊自己的理解. (1) 解耦 现有系统A, B, C, 系统B和C需要系统A的数据, 然后我们就修改系统A的代码, 给系统B, C发送数据. 这时系统D也需要系统A的数据, 我们又要修改系统A的代码, 给系统D发送数据. 如果这时系统B不需要系统A的数据了呢? 简直崩溃了, 新增或减少一个系统, 我们都要去修改系统A的代码, 而且我们还需要考虑调用的系统挂掉了怎么办, 是否要将数据存起来, 是否要重发等等, 这是非常不合理的一种设计, 我们需要引入消息队列. 引入消息队列后, 系统A产生的数据直接发送到消息队列中, 哪个系统需要系统A的数据就直接去消息队列中消费, 这样系统A就和其他系统彻底解耦了. (2) 异步 客户端调用A系统的一个接口处理某个功能, 该功能需要调用B, C, D系统进行处理, 如果A系统自身耗时为20ms, B, C, D系统耗时分别是300ms, 450ms, 200ms, 最终接口返回时总共耗时970ms, 这肯定是不可接受的, 我们需要引入消息队列. 引入消息队列后, 系统A将消息发送到消息队列中就可以直接返回, 接口总共耗时很短,

Springboot中使用kafka

╄→尐↘猪︶ㄣ 提交于 2020-02-01 07:49:03
注:kafka消息队列默认采用配置消息主题进行消费,一个topic中的消息只能被同一个组(groupId)的消费者中的一个消费者消费。 1.在pom.xml依赖下新添加一下kafka依赖ar包 <!--kafka--> <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> <version>1.1.1.RELEASE</version> </dependency> <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka_2.10</artifactId> <version>0.10.0.1</version> </dependency> 2.在application.properties增加配置: #原始数据kafka读取 kafka.consumer.servers=IP:9092,IP:9092(kafka消费集群ip+port端口) kafka.consumer.enable.auto.commit=true(是否自动提交) kafka.consumer.session.timeout=20000(连接超时时间) kafka.consumer.auto

1、RabbitMQ简介

蓝咒 提交于 2020-02-01 06:03:15
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台(OTP)框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。 Erlang(爱浪)特点: 并发性:Erlang支持超大量级的并发进程,并且不需要操作系统具有并发机制; 分布式:一个分布式Erlang系统是多个Erlang节点组成的网络; 健壮性:Erlang具有多种基本的错误检测能力,它们能够用于构建容错系统; 可伸缩性; 教程: RabbitMQ实战指南.pdf 消息丢失 如果应用系统对可靠性要求很高,吞吐量不是很care,那么可以从以下几个方面入手: 1、交换器、队列、消息持久化; 2、消费者设置autoAck=false,手动确认; 3、RabbitMQ的镜像队列机制,Master-Slave高可用,集群都挂掉的可能性比单机挂掉的概率要小很多,几乎不用考虑,理由:RabbitMQ 并不会为每条消息都进行同步存盘(调用内核的 fsync方法)的处理,可能仅仅保存到操作系统缓存之中而不是物理磁盘之中。如果在这段时间内RabbitMQ 服务节点发生了岩机、重启等异常情况,消息保存还没来得及落盘,那么这些消息将会丢失; 4、生产者确认:事务机制、发送方确认机制

微服务项目学习之RabbitMQ

岁酱吖の 提交于 2020-02-01 01:04:06
微服务项目学习之RabbitMQ 什么是RabbitMQ MQ全称为Message Queue,即消息队列,RabbitMQ是由erlang语言开发,基于AMQP(Advanced Message Queue 高级消息队列协议)协议实现的消息队列,它是一种应用程序之间的通信方法,消息队列在分布式系统开发中应用非常广泛。 RabbitMQ官方地址 . 开发中消息队列通常有如下应用场景: 1、任务异步处理。 将不需要同步处理的并且耗时长的操作由消息队列通知消息接收方进行异步处理。提高了应用程序的响应时间。 2、应用程序解耦合。MQ相当于一个中介,生产方通过MQ与消费方交互,它将应用程序进行解耦合。 市场上还有哪些消息队列? ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ、Redis。 为什么使用RabbitMQ呢? 1、使得简单,功能强大。 2、基于AMQP协议。 3、社区活跃,文档完善。 4、高并发性能好,这主要得益于Erlang语言。 5、Spring Boot默认已集成RabbitMQ。 AMQP AMQP是一套公开的消息队列协议,最早在2003年被提出,它旨在从协议层定义消息通信数据的标准格式,为的就是解决MQ市场上协议不统一的问题。RabbitMQ就是遵循AMQP标准协议开发的MQ服务。 AMQP官方地址 . JMS

RabbitMQ面试题

江枫思渺然 提交于 2020-01-31 17:22:06
1、为什么要引入MQ系统,直接读写数据库不行吗? 其实就是问问你消息队列都有哪些使用场景,然后你项目里具体是什么场景,说说你在这个场景里用消息队列是什么? 面试官问你这个问题,期望的一个回答是说,你们公司有个什么业务场景,这个业务场景有个什么技术挑战,如果不用 MQ 可能会很麻烦,但是你现在用了 MQ 之后带给了你很多的好处。 先说一下消息队列常见的使用场景吧,其实场景有很多,但是比较核心的有 3 个:解耦、异步、削峰。 解耦:多系统多进程的数据交换,用pub/sub 异步:把大数据量的同步处理改为异步 削峰:一般的A 系统使用 MySQL,扛到每秒 2k 个请求就差不多了,如果每秒请求到 5k 的话,可能就直接把 MySQL 给打死了,导致系统崩溃,用户也就没法再使用系统了。如果使用 MQ, 每秒 5k 个请求写入 MQ,A 系统每秒钟最多处理 2k 个请求,因为 MySQL 每秒钟最多处理 2k 个。A 系统从 MQ 中慢慢拉取请求,每秒钟就拉取 2k 个请求,不要超过自己每秒能处理的最 大请求数量就 ok,这样下来,哪怕是高峰期的时候,A 系统也绝对不会挂掉,这又设计请求排队的问题。 2、消息队列有什么优缺点? 优点:解耦、异步、削峰 缺点: 系统可用性降低 系统引入的外部依赖越多,越容易挂掉。本来你就是 A 系统调用 BCD 三个系统的接口就好了,人 ABCD

mac下安装并启动RabbitMQ

浪尽此生 提交于 2020-01-31 13:41:55
前言   RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而群集和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。   RabbitMQ是一套开源(MPL)的消息队列服务软件,是由 LShift 提供的一个 Advanced Message Queuing Protocol (AMQP) 的开源实现,由以高性能、健壮以及可伸缩性出名的 Erlang 写成。 正文   在django需要使用异步操作的情况下,Celery是一个常用的库。在实际的项目中,Celery又需要依赖RabbitMQ。所以,安装和使用RabbitMq是一切的关键。在macos中一般使用:brew来安装,下面给出安装步骤: 1 安装更新:brew update 2 安装rabbitmq:brew install rabbitmq rabbitmq的脚本都安装在目录:/usr/local/Cellar/rabbitmq 的sbin下面,也等同于目录:/usr/local/opt/rabbitmq/sbin下 接下来就需要在环境变量中添加:export PATH=$PATH:/usr/local/opt/rabbitmq/sbin 即可:

如何实现延迟队列

十年热恋 提交于 2020-01-31 06:54:03
延迟队列的需求各位应该在日常开发的场景中经常碰到。比如: 用户登录之后5分钟给用户做分类推送; 用户多少天未登录给用户做召回推送; 定期检查用户当前退款账单是否被商家处理等等场景。 一般这种场景和定时任务还是有很大的区别,定时任务是你知道任务多久该跑一次或者什么时候只跑一次,这个时间是确定的。延迟队列是当某个事件发生的时候需要延迟多久触发配套事件,引子事件发生的时间不是固定的。 业界目前也有很多实现方案,单机版的方案就不说了,现在也没有哪个公司还是单机版的服务,今天我们一一探讨各种方案的大致实现。 1. Redis zset 石头 www.10tou.com 这个方案比较常用,简单有效。利用 Redis 的 sorted set 结构,使用 timeStamp 作为 score,比如你的任务是要延迟5分钟,那么就在当前时间上加5分钟作为 score ,轮询任务每秒只轮询 score 大于当前时间的 key即可,如果任务支持有误差,那么当没有扫描到有效数据的时候可以休眠对应时间再继续轮询。 方案优劣 : 优点: 简单实用,一针见血。 缺点: 单个 zset 肯定支持不了太大的数据量,如果你有几百万的延迟任务需求,大哥我还是劝你换一个方案; 定时器轮询方案可能会有异常终止的情况需要自己处理,同时消息处理失败的回滚方案,您也要自己处理。 所以,sorted set

2、kafka消费者

谁都会走 提交于 2020-01-31 04:26:02
本文主要用来整理kafka消费者相关的一些知识点并加以自我理解,主要参考自《深入理解kafka核心设计与实践原理》--朱忠华 应用程序主要就是通过KafkaConsumer来订阅主题,并从订阅的主题中拉取消息。使用KafkaConsumer之前先要了解消费组和消费者之间的概念关系; 1、消费者和消费组 消费者Cosumer负责订阅主题topic,并从订阅的主题中拉去消息。与其它消息中间件不同的是:Kakfa的消费者Consumer和主题之间还有一层消费组(Consumer Group),每个消费者都有一个对应的消费组,主题中的每条消息只能被订阅它的消费组下的一个消费者拉取消费; 例如某个主题下有4个分区:P0,P1,P2,P3,有两个消费组A group和B group 都订阅了这个主题;消费组A中有4个消费者(C0,C1,C2,C3),消费组B中有两个消费者(C4,C5);按照kafka默认的分配规则,主题下的每个分区只能被同一个消费组中的一个消费组所消费,最终的分配结果将是A中的每个消费者分配到一个分区,B中的每个消费者分配到两个分区;如下图: 再看下组内消费者个数变化时所对应的分区分配的演变。当上述的消费组A中的消费者变为3个只剩C0、C1、C2时,对应的就会有一个消费者就会分配到两个分区; 当A消费组中的消费者个数变为5个添加C6,那么由于C0~C3已经分配了所有分区

springboot集成rabbitmq

余生颓废 提交于 2020-01-30 19:03:18
RabbitMQ简介 RabbitMQ使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现(AMQP的主要特征是面向消息、队列、路由、可靠性、安全)。支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现很出色。 相关概念 消息队列通常有三个概念:发送消息(生产者)、队列、接收消息(消费者)。RabbitMQ在这个基本概念之上,多做了一层抽象,在发送消息和队列之间,加入了交换机。这样发送消息和队列就没有直接关系,而是通过交换机来做转发,交换机会根据分发策略把消息转给队列。 RabbitMQ比较重要的几个概念: 虚拟主机:RabbitMQ支持权限控制,但是最小控制粒度为虚拟主机。一个虚拟主机可以包含多个交换机、队列、绑定。 交换机:RabbitMQ分发器,根据不同的策略将消息分发到相关的队列。 队列:缓存消息的容器。 绑定:设置交换机与队列的关系。 交换机(Exchange) 交换机的主要作用是接收相应的消息并且绑定到指定的队列.交换机有四种类型,分别为Direct,topic,headers,Fanout.   Direct是RabbitMQ默认的交换机模式,也是最简单的模式.即创建消息队列的时候