文档章节

消息队列的探究

骑着机车敲代码
 骑着机车敲代码
发布于 2017/02/15 16:02
字数 823
阅读 39
收藏 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
博文 70
码字总数 31439
作品 0
杭州
程序员
私信 提问
源码分析RocketMQ之CommitLog消息存储机制

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

小红牛
06/06
0
0
线程池的基本使用与原理(一)

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

qq_36523667
03/04
0
0
Actor模型的本质:究竟是要解决什么问题

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

桂哥
2012/02/01
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

没有更多内容

加载失败,请刷新页面

加载更多

斗图咖(www.doutuka.com)上线纪念

网站名称:斗图咖 网站描述:是一款年轻人都在玩的斗图网站,来斗图咖一起斗图装逼交朋友吧。站长每天上传收集的最新最火斗图,供大家娱乐聊天发表情;后期也会开发表情自主设计,自己设计表...

focusone
22分钟前
2
0
Spring AOP 切面编程记录日志和接口执行时间

最近客户现在提出系统访问非常慢,需要优化提升访问速度,在排查了nginx、tomcat内存和服务器负载之后,判断是数据库查询速度慢,进一步排查发现是因为部分视图和表查询特别慢导致了整个系统...

编程SHA
33分钟前
5
0
年度大盘点:机器学习开源项目及框架

摘要: 2018年马上就要结束了,我们来回顾一下过去的这一年中,机器学习领域有哪些有趣的事情吧! 我们先来看看Mybridge AI 中排名靠前的顶级开源项目,再聊聊机器学习今年都有哪些发展,最后...

阿里云官方博客
37分钟前
6
0
15个Spring的核心注释示例

众所周知,Spring DI和Spring IOC是Spring Framework的核心概念。让我们从org.springframework.beans.factory.annotation和org.springframework.context.annotation包中探索一些Spring核心注......

java菜分享
39分钟前
2
0
[LintCode] Binary Tree Level Order Traversal(二叉树的层次遍历)

描述 给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问) 样例 给一棵二叉树 {3,9,20,#,#,15,7} : 3 / \9 20 / \ 15 7 返回他的分层遍历结果: [ [3], [...

honeymose
48分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部