文档章节

消息队列的探究

骑着机车敲代码
 骑着机车敲代码
发布于 2017/02/15 16:02
字数 823
阅读 30
收藏 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:

© 著作权归作者所有

共有 人打赏支持
骑着机车敲代码
粉丝 15
博文 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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

dubbo部分常见的面试题目

1、什么是AMQP协议? AMQP的全称是 Advanced Message Queuing Protocol (高级消息队列协议) 他是应用层协议的一个开放的标准,为面向消息中间件而设计,基于此协议的客户端和消息中间件可以...

DemonsI
9分钟前
0
0
http和https协议

HTTPS全称为Hypertext Transfer Protocol over Secure Socket Layer,中文含义为“超文本传输协议在安全加密字层”,简单来说就是加密数据传输,通俗的说就是安全连接。 HTTPS安全超文本传输...

寰宇01
10分钟前
0
0
vue内引入语音播报功能

在vue项目中引入语音播报,使用的科大讯飞语音接入, 具体思路为每次接收到语音信息后存入一个数组,然后监听这个数组,开始冲第一个索引播放,并且同时根据vuex getter 来动态删减数量 给a...

originDu
18分钟前
0
0
Java创建对象的五种方式

一、使用new关键字,调用构造方法创建对象 Person p1 = new Person(); 运行过程: 1、给新对象分配内存空间,将数据存储到堆。 2、执行显示的初始化。 3、执行构造器。new方法中括号参数传递...

Drathin
19分钟前
0
0
git使用纪要

之前公司一直没用git,于是自己注册了一个账号自己用,因为也没人合作,所以也没太关注协作方面的事情。最近公司终于想通了,开始用git,于是研究了一下,在此做个记录。 git功能非常灵活,因...

propagator
24分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部