文档章节

消息队列的探究

骑着机车敲代码
 骑着机车敲代码
发布于 2017/02/15 16:02
字数 823
阅读 32
收藏 0

##1、选择推送还是拉取 在消息系统中,一般有两种消费模式:服务端推送和客户端拉取。若系统主要面向公网的服务器,采用推送模式,有如下优点 :

  1. 实时性高。从消息的产生到推送,总体平均延时100毫秒,最大不超过200毫秒。
  2. 服务器压力小。相比于拉取模式,每次推送都有数据,避免空轮询消耗资源。
  3. 使用简便。使用拉取模式,客户端需要维护消费队列的位置,以及处理多客户端同时消费的并发问题。而在推送模式中,这些事情全部由服务器完成,客户端仅需要启动SDK监听消息即可,几乎没有使用门槛。

当然,系统也支持客户端拉取,推送系统会将客户端的拉取请求转换为推送请求,直接返回。推送服务器会据此请求推送相应数据到客户端。即拉取异步化,如果客户端没有新产生的数据,不会返回任何数据,减少客户端的网络消耗。

##2、消息队列如何实现消息的顺序消费

  • 在很多场景下,如何保证队列信息的有序处理是一个棘手的问题。如下图,假定分布式队列保证请求严格有序,请求ri2和ri1都是针对同一数据记录的不同状态,ri2的状态比ri1的状态新。T1、T2、T3和T4代表各个操作发生的时间,并且 T1 < T2 < T3 < T4("<"代表早于)。

    采用多消费者架构,这两条记录被两个消费者(Consumer1和Consumer2)处理后更新到数据库里面。Consumer1虽然先读取ri1但是却后写入数据库,这就导致,新的状态被老的状态覆盖,所以多消费者不保证数据的有序性。 输入图片说明

  • 所以全局顺序是不可能实现的,但是可以实现偏序。

    设计思想参考:https://www.zhihu.com/question/30195969

  • 如果push模式的消息队列,支持分区,单分区只支持一个消费者消费,并且消费者只有确认一个消息消费后才能push送另外一个消息,还要发送者保证全局顺序唯一,听起来也能做顺序消息,但成本太高了,尤其是必须每个消息消费确认后才能发下一条消息,这对于本身堆积能力和慢消费就是瓶颈的push模式的消息队列,简直是一场灾难。 反观pull模式,如果想做到全局顺序消息,就相对容易很多:

    producer对应partition,并且单线程。

    consumer对应partition,消费确认(或批量确认),继续消费即可。 所以对于日志push送这种最好全局有序,但允许出现小误差的场景,pull模式非常合适。如果你不想看到通篇乱套的日志~~

    Anyway,需要顺序消息的场景还是比较有限的而且成本太高,请慎重考虑。

REF:

© 著作权归作者所有

共有 人打赏支持
骑着机车敲代码
粉丝 16
博文 63
码字总数 30810
作品 0
杭州
程序员
源码分析RocketMQ之CommitLog消息存储机制

本文重点分析Broker接收到生产者发送消息请求后,如何存储在Broker上,本文暂不关注事务消息机制。 RocketMQ的存储核心类为DefaultMessageStore,存储消息的入口方法为:putMessage 在深入学习...

小红牛
06/06
0
0
Actor模型的本质:究竟是要解决什么问题

Actor模型的本质已经被强调了无数遍:万物皆Actor。Actor之间只有发送消息这一种通信方式,例如,无论是管理员让工作者干活,还是工作者把成果交还给管理员,它们之间也要通过发送消息的方式...

桂哥
2012/02/01
0
0
线程池的基本使用与原理(一)

先明确Runnable和Thread的关系 Runnable.run就是简单的方法调用,其逻辑依然是在主线程中调用的; 而使用Thread就可以实现线程的切换(Thread原理在接下来的文章中会剖析)。 但是Thread在s...

qq_36523667
03/04
0
0
挖洞经验 看我如何发现雅虎网站的3个RCE漏洞

  今天我要分享的是,我参与雅虎(Yahoo)漏洞赏金项目发现的3个RCE漏洞。雅虎漏洞测试范围中涉及了很多服务应用,而我发现的漏洞就与雅虎的BrightRoll应用和中小企业服务相关。      ...

FreeBuf
05/11
0
0
(五)基于RocketMQ--Demo项目的测试和原理说明

简介: 文章一、二、三为RocketMQ的初步了解、搭建环境工作,文章四基于myeclipse搭建Demo测试项目 本文的内容基于之前的Demo项目和环境进行测试工作,探究说明RocketMQ的工作原理 术语解释 ...

萧沐垚
2016/12/16
704
0

没有更多内容

加载失败,请刷新页面

加载更多

初级开发-编程题

` public static void main(String[] args) { System.out.println(changeStrToUpperCase("user_name_abc")); System.out.println(changeStrToLowerCase(changeStrToUpperCase("user_name_abc......

小池仔
今天
4
0
现场看路演了!

HiBlock
昨天
13
0
Rabbit MQ基本概念介绍

RabbitMQ介绍 • RabbitMQ是一个消息中间件,是一个很好用的消息队列框架。 • ConnectionFactory、Connection、Channel都是RabbitMQ对外提供的API中最基本的对象。Connection是RabbitMQ的s...

寰宇01
昨天
9
0
官方精简版Windows10:微软自己都看不过去了

微软宣布,该公司正在寻求解决方案,以减轻企业客户的Windows 10规模。该公司声称,企业客户下载整个Windows 10文件以更新设备既费钱又费时。 微软宣布,该公司正在寻求解决方案,以减轻企业...

linux-tao
昨天
17
0
TypeScript基础入门之JSX(二)

转发 TypeScript基础入门之JSX(二) 属性类型检查 键入检查属性的第一步是确定元素属性类型。 内在元素和基于价值的元素之间略有不同。 对于内部元素,它是JSX.IntrinsicElements上的属性类型...

durban
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部