消息队列

【mq读书笔记】顺序消息

岁酱吖の 提交于 2020-02-11 02:21:30
mq支持局部消息顺序消费,可以确保同一个消息消费队列中的消息被顺序消费。看下针对顺序消息在整个消费过程中做的调整: 队列负载: DefaultMQPushConsumerImpl#consumeOrderly决定是否是顺序消息, org.apache.rocketmq.client.impl.consumer.RebalanceImpl#rebalanceByTopic: 在新分配到队列时,新添加消息拉取任务之前会先检查是否是顺序消息。如果是顺序消息检查上锁是否成功: 消息拉取: DefaultMQPushConsumerImpl#pullMessage: 如果是顺序消息但队列未被锁定,则延迟3s后再将pullRequest对象放入到拉取任务中,如果该处理队列是第一次拉取任务,则首先计算拉取偏移量,然后向消息服务端拉取消息。 消息消费: public class ConsumeMessageOrderlyService implements ConsumeMessageService { private static final InternalLogger log = ClientLogger.getLog(); private final static long MAX_TIME_CONSUME_CONTINUOUSLY = Long.parseLong(System

消息队列(一)简介

久未见 提交于 2020-02-10 20:54:15
消息队列(MQ)概述 消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以简单地描述为: 当不需要立即获得结果,但是并发量又需要进行控制的时候,差不多就是需要使用消息队列的时候。 消息队列主要解决了应用耦合、异步处理、流量削锋等问题。 当前使用较多的消息队列有RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMq等,而部分数据库如Redis、Mysql以及phxsql也可实现消息队列的功能。 消息队列使用场景 消息队列在实际应用中包括如下四个场景: 应用耦合:多应用间通过消息队列对同一消息进行处理,避免调用接口失败导致整个过程失败; 异步处理:多应用对消息队列中同一消息进行处理,应用间并发处理消息,相比串行处理,减少处理时间; 限流削峰:广泛应用于秒杀或抢购活动中,避免流量过大导致应用系统挂掉的情况; 消息驱动的系统:系统分为消息队列、消息生产者、消息消费者,生产者负责产生消息,消费者(可能有多个)负责对消息进行处理; 下面详细介绍上述四个场景以及消息队列如何在上述四个场景中使用: 异步处理 具体场景:用户为了使用某个应用,进行注册,系统需要发送注册邮件并验证 短信 。对这两个操作的处理方式有两种:串行及并行。 串行方式 新注册信息生成后,先发送注册邮件,再发送验证短信; 在这种方式下

Kafka是如何实现高性能的

最后都变了- 提交于 2020-02-10 17:45:47
原创:享学课堂讲师 转发请注明出处 Kafka是一个单机支持百万吞吐的高效中间件,在互联网领域经常将它用作消息队列,那么Kafka是如何实现这么性能的呢? 宏观架构层面利用Partition实现并行处理 Kafka中每个Topic都包含一个或多个Partition,不同Partition可位于不同节点。同时Partition在物理上对应一个本地文件夹,每个Partition包含一个或多个Segment,每个Segment包含一个数据文件和一个与之对应的索引文件。在逻辑上,可以把一个Partition当作一个非常长的数组,可通过这个“数组”的索引(offset)去访问其数据。 一方面,由于不同Partition可位于不同机器,因此可以充分利用集群优势,实现机器间的并行处理。另一方面,由于Partition在物理上对应一个文件夹,即使多个Partition位于同一个节点,也可通过配置让同一节点上的不同Partition置于不同的磁盘上,从而实现磁盘间的并行处理,充分发挥多磁盘的优势。 具体实现层面高效使用磁盘特性和操作系统特性 将写磁盘的过程变为顺序写 Kafka的整个设计中,Partition相当于一个非常长的数组,而Broker接收到的所有消息顺序写入这个大数组中。同时Consumer通过Offset顺序消费这些数据,并且不删除已经消费的数据,从而避免了随机写磁盘的过程。

01 | 为什么需要消息队列?

萝らか妹 提交于 2020-02-10 17:15:22
对于对于这 5 个步骤来说,能否决定秒杀成功,实际上只有风险控制和库存锁定这 2 个步骤。只要用户的秒杀请求通过风险控制,并在服务端完成库存锁定,就可以给用户返回秒杀结果了,对于后续的生成订单、短信通知和更新统计数据等步骤,并不一定要在秒杀请求中处理完成。 对于超时的请求可以直接丢弃,APP 将超时无响应的请求处理为秒杀失败即可。 实现的方式也很简单,不需要破坏原有的调用链,只要网关在处理 APP 请求时增加一个获取令牌的逻辑。 令牌发生器按照预估的处理能力,匀速生产令牌并放入令牌队列 (如果队列满了则丢弃令牌) , 网关在收到请求时去令牌队列消费一个令牌,获取到令牌则继续调用后端秒杀服务,如果获取不到令牌则直接返回秒杀失败。 消息队列的另外一个作用,就是实现系统应用之间的解耦 消息队列最常被使用的三种场景: 异步处理、流量控制和服务解耦 。 当然,消息队列的适用范围不仅仅局限于这些场景,还有包括: 作为发布 / 订阅系统实现一个微服务级系统间的观察者模式; 连接流计算任务和数据; 用于将消息广播给大量接收者。 同时我们也要认识到,消息队列也有它自身的一些问题和局限性,包括: 引入消息队列带来的延迟问题; 增加了系统的复杂度; 可能产生数据不一致的问题。 来源: https://www.cnblogs.com/lakeslove/p/12291431.html

消息队列中的面试题

♀尐吖头ヾ 提交于 2020-02-10 16:01:14
消息队列的匹配规则 1.消息队列模式 消息队列模式:发送者,接受者 2.主题消息模式 主题消息:发布者,订阅者 3.Rabbitmq消息确认机制 通过持久化数据的方式,生产者将消息发送出去之后,消息到底有没有达到rabbitmq服务器默认是不知道的。 消息队列如何确保其消息的顺序性 通常来说有以下的思路 单线程消费来确保消息的顺序性 对消息进行编号,消费者处理时根据编号判断顺序。 rabbitmq:(队列消息的思路) 拆分多个queue,每个queue一个consumer。或者就一个queue但是对应一个consumer,然后这个consumer内部用内存队列做排队,然后分发给底部不同worker处理 防止使用同一个队列,导致数据123进入不同的消费者,从而使得数据123没有按指定的顺序被执行 通过拆分queue来保证每一个消费者都能获得完整的数据123,然后消费者内部进行排队,从而保证消息的有序性。 这里同时也要设计,保证消息的幂等性。 kafka 一个topic,一个partition(分割),一个consumer,内部单线程消费,写N个内存queue,然后N个线程分别消费一个内存queue。 通过指定key的方式,来确保相关的数据123会分发到同一个partition partition会内部对其进行排序,保证其有序性。 消息队列如何保证其不会重复消费 简单来说

消息队列

生来就可爱ヽ(ⅴ<●) 提交于 2020-02-10 10:58:14
1、什么场景下使用消息队列? 高并发环境 2、使用消息队列的优点和缺点: 优点: 解耦、异步、削峰 a、解耦 看这下面场景。A 系统发送数据到 BCD 三个系统,通过接口调用发送。如果 E 系统也要这个数据呢?那如果 D 系统现在不需要了呢?A 系统负责人几乎崩溃......  在这个场景中,A 系统跟其它各种乱七八糟的系统严重耦合,A 系统产生一条比较关键的数据,很多系统都需要 A 系统将这个数据发送过来。A 系统要时时刻刻考虑 BCDE 四个系统如果 挂了 该咋办? 要不要重发 , 要不要把消息存起来? 头发都白了啊! 如果使用 MQ,A 系统产生一条数据,发送到 MQ 里面去,哪个系统需要数据自己去 MQ 里面消费。如果新系统需要数据,直接从 MQ 里消费即可;如果某个系统不需要这条数据了,就取消对 MQ 消息的消费即可。这样下来,A 系统压根儿不需要去考虑要给谁发送数据,不需要维护这个代码,也不需要考虑人家是否调用成功、失败超时等情况。 总结 :通过一个 MQ,Pub/Sub 发布订阅消息这么一个模型,A 系统就跟其它系统彻底解耦了。 面试技巧 :你需要去考虑一下你负责的系统中是否有类似的场景,就是一个系统或者一个模块,调用了多个系统或者模块,互相之间的调用很复杂,维护起来很麻烦。但是其实这个调用是不需要直接同步调用接口的,如果用 MQ 给它异步化解耦,也是可以的

day20kafka

给你一囗甜甜゛ 提交于 2020-02-10 07:50:00
Storm 上游数据源之 Kakfa PS:什么是kafka,为什么要学习它? http://blog.csdn.net/zcf_0923/article/details/70859535http://blog.csdn.net/SJF0115/article/details/78480433PS :kafka他不仅仅只是一个消息队列PS:发布与订阅系统一般会有一个broker,也就是发布消息的中心点PS:kafka的数据单元被称为消息, 可以理解为数据库的一条记录PS: def 批次 5.3 Kafka 集群部署 PS:启动kafka时,要先启动zookeeper 5.3.1 、下载安装包 http://kafka.apache.org/downloads.html 在 linux 中使用 wget 命令下载安装包 wget http://mirrors.hust.edu.cn/apache/kafka/0.8.2.2/kafka_2.11-0.8.2.2.tgz 5.3.2 、解压安装包 tar -zxvf kafka_2.11-0.8.2.2.tgz -C /apps/ cd /export/servers/ ln -s kafka_2.11-0.8.2.2 kafka 5.3.3 、修改配置文件 cp /export/servers/kafka/config/server

rabbitMQ 6种工作模式

…衆ロ難τιáo~ 提交于 2020-02-08 21:44:16
1 simple简单模式 消息产生着将消息放入队列 消息的消费者(consumer) 监听(while) 消息队列,如果队列中有消息,就消费掉,消息被拿走后,自动从队列中删除(隐患 消息可能没有被消费者正确处理,已经从队列中消失了,造成消息的丢失)应用场景:聊天(中间有一个过度的服务器;p端,c端) 2 work工作模式(资源的竞争) 消息产生者将消息放入队列消费者可以有多个,消费者1,消费者2,同时监听同一个队列,消息被消费?C1 C2共同争抢当前的消息队列内容,谁先拿到谁负责消费消息(隐患,高并发情况下,默认会产生某一个消息被多个消费者共同使用,可以设置一个开关(syncronize,与同步锁的性能不一样) 保证一条消息只能被一个消费者使用) 应用场景:红包;大项目中的资源调度(任务分配系统不需知道哪一个任务执行系统在空闲,直接将任务扔到消息队列中,空闲的系统自动争抢) 3 publish/subscribe发布订阅(共享资源) X代表交换机rabbitMQ内部组件,erlang 消息产生者是代码完成,代码的执行效率不高,消息产生者将消息放入交换机,交换机发布订阅把消息发送到所有消息队列中,对应消息队列的消费者拿到消息进行消费 相关场景:邮件群发,群聊天,广播(广告) 4 routing路由模式 消息生产者将消息发送给交换机按照路由判断,路由是字符串(info)

windows安装rabbitMQ

為{幸葍}努か 提交于 2020-02-08 12:52:03
简介: rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统。它遵循Mozilla Public License开源协议,采用 Erlang 实现的工业级的消息队列(MQ)服务器,Rabbit MQ 是建立在Erlang OTP平台上。 windows安装: Erlang快速下载: https://www.erlang-solutions.com/resources/download.html 国内加速下载 rabbitMQ server: https://www.newbe.pro/Mirrors/Mirrors-RabbitMQ/ 安装完成后添加环境变量,erlang的sbin路径和rabbitmq的bin路径 安装插件:rabbitmq-plugins.bat enable rabbitmq_management 启动rabbitmq:rabbitmq-server.bat 管理后台: http://localhost:15672 ,用户名:guest 密码:guest 来源: https://www.cnblogs.com/aaron-agu/p/12275915.html

kafaka,activityMQ,rabbitMQ消息中间件对比

泪湿孤枕 提交于 2020-02-08 03:47:16
kafaka,activityMQ,rabbitMQ消息中间件对比 说明 本次测试,使用kafaka,activityMQ,rabbitMQ消息中间件进行对比,均采用一个消息队列,测试中间件在收发消息时时延。 测试前置条件 1.消费者端只配置一个消费者来消费数据。 2.多线程才用jmeter通过http请求来进行测试。 3.actitvityMQ在1000线程100次时,时延太大,受制于电脑性能未测试。 测试结果 结论 从结果上来看,在消息发送方面,kafak的效率较高,rabbitMQ次之,activityMQ最慢;在消息处理时延方面单线程情况下activityMQ的效率较高,kafak次之,rabbitMQ最慢,但考虑到activityMQ发送较慢,队列中堆积消息少,故处理时延较小,参考性不强;在多线程方面kafak处理较快,rabbitMQ次之,activityMQ最慢。在消息可靠性方面在测试10万条消息时均未发现消息丢失问题,但阅读资料kafak会有少量丢消息的情况存在。结合业务方面考虑,在需要消息可靠保证的需求可以采用rabbitMQ,例如:计划下达生产,控投等业务。对于吞吐量高,但对于可靠性要求不是太高的可以采用kafak,例如记录日志的消息。 来源: CSDN 作者: Asia1752 链接: https://blog.csdn.net/Asia1752