什么是消息系统?

首先来看什么是消息系统?简单来讲就是生产者发送包含事件的消息给消息系统,然后将消息推送给消费者。消息系统有很多种,最简单的就是TCP连接这种的直接信道,之后出现的消息系统大多都是在这个模型上构建的,只不过TCP是生产者和消费者一对一,更完善的消息系统是多对多的形式。

如果让你来设计消息系统

  1. 生产者发送消息的速度比消费者快,消息系统该怎么处理?
  2. 消息系统布置的节点崩溃,消息要怎么处理?
  3. 当消息发送失败或者重复时,重试机制要怎么处理?

带着这些问题继续下去

1.生产者直接将消息发送给消费者

这个算是最简单粗暴的处理方式,消息不经过中间节点。但是这个需要生产者和消费者考虑消息丢失的可能性,在消息处理的过程种需要生产者和消费者长期保持在线,一旦有一方不在线,消息便会丢失无法找回。所以这个时候需要消息代理使得消费者和生产者解耦。

代表系统:UDP,ZeroMQ

2.消息代理的方式(JMS/AMQP)

消息代理实质上是一种针对处理消息流而优化的数据库。 它作为服务器运行,生产者和消费者作为客户端连接到服务器。生产者将消息写入代理,消费者通过从代理那里读取来接收消息,使得生产者和消费者可以顺利解耦。消息的持久性以及消费消息速度过缓的问题也交给了消息代理去解决。这样的后果就是生产者和消费者不再是同步处理数据,而是异步,生产者产生完消息后可以不用再管消费者是否消费。

当有多个消费者时,消息的发送方式
  1. load balance 让多个客户端共享同一队列以分担队列的消费压力
  2. fan-out 同一个消息会发给订阅此队列的所有的消费者

两者的区别在于load balance当一个客户端消费完一条消息后,这条消息不会再被其它客户端消费,但是fan-out则是一个消息可以让多个客户端同时消费到。

消息确认机制

为了防止消费者消费过程种出现问题,一般的消费代理都会有确认机制,只有当消费者发回确认消息后,消息才会被删除,否则就有可能等待另一个消费消费。这里会出现一个问题,当使用load balanc时,会出现消息乱序的情况。

代表系统:RabbitMQ

3.基于日志的消息代理

前面的文章提过日志是只增不减的有序序列,在消息系统里,日志也可以成为消息的存储媒介,最新的消息永远是日志的最后,消费者只要记住自己的读取的位移,不断往后移就可以读到最新的消息,而日志也带给了消息系统真正的消息持久化,消费者可以持续的从某个时间段抽取数据。为了提高吞吐量,日志也可以做分区,每一个主题包含一定数量的分区,分区也可以分布在各个不同的机器上。

因为日志的读取方式,所以天然支持fan-out的发送方式,为了支持load balance,可以将整个分区丢给消费者组。但是这要求消费者必须以单线程消费数据,从而降低了性能。

代表系统:Kafka

小总结

因此在消息处理代价高昂,希望逐条并行处理,以及消息的顺序并没有那么重要的情况下, 可以使用JMS/AMQP风格的消息代理。另一方面,在消息吞吐量很高,需要处理迅速,顺序很重要的情况下,基于日志的方法值得选择。

原文发布于微信公众号 - 鸿的学习笔记(shujuxuexizhilu)

原文发表时间:2018-07-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏鸿的学习笔记

Apache Kafka设计理念探究

创造一个分布式的实时流处理平台,也正是因为这个原因,Kafka选择了将日志分区和消费者群组模型。

841
来自专栏积累沉淀

kafka学习之路(一)——入门

kafka学习之路(一)——入门 Kafka学习之路... 一、入门.. 1、 简介 2、 主题(Topics)、日志(Logs) 3、 分布式(Distrib...

35910
来自专栏C/C++基础

google C++编程风格指南之头文件的包含顺序

(1)为了加强可读性和避免隐含依赖,应使用下面的顺序:C标准库、C++标准库、其它库的头文件、你自己工程的头文件。不过这里最先包含的是首选的头文件,即例如a.c...

1031
来自专栏JAVA高级架构

高并发解决方案--负载均衡

1962
来自专栏小白安全

绕过Edge、Chrome和Safari的内容安全策略

概述 ---- Web应用中有许多基本的安全机制,其中一个是同源(same-origin)策略机制,该机制规定了应用程序代码可以访问的资源范围。同源策略的...

4227
来自专栏数据和云

运维经验:回滚段异常的特殊救急方法

? 冷菠 冷菠,资深DBA,著有《Oracle高性能自动化运维》,有近10年的数据库运维、团队管理以及培训经验。擅长数据库备份恢复、数据库性能诊断优化以及数据...

4139
来自专栏PHP在线

post和get请求方式以及区别

1.一些枯燥的概念: Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。 URL全称是资源描述符,我们可以...

3048
来自专栏Seebug漏洞平台

DeDeCMS v5.7 密码修改漏洞分析

织梦内容管理系统(DedeCms)以简单、实用、开源而闻名,是国内最知名的PHP开源网站管理系统,也是使用用户最多的PHP类CMS系统,在经历多年的发展,目前的...

4668
来自专栏个人分享

RPC远程过程调用协议

  最近学习Hadoop、Hbase、Spark及Storm原理,经常会出现RPC这样的传输术语,为了更好地理解,将知识点详细的整理下吧~

4264
来自专栏idba

主从替换之后的复制风暴

一套MySQL主-备-备-备数据库,其中的备库升级到主库之后,系统监控报警 Seconds_Behind_Master 瞬间为0,瞬间为数十万秒。第一感觉是遇...

1792

扫码关注云+社区

领取腾讯云代金券