EQueue 2.3.2版本发布(支持高可用)

前言

前段时间针对EQueue的完善终于告一段落了,实在值得庆祝,自己的付出和坚持总算有了成果。这次新版本主要为EQueue实现了集群功能,基本实现了Broker的高可用。另外还增加了很多实用的功能,对性能也做了很多优化。总之,EQueue越来越成熟了。

EQueue最新版本信息

版本发布说明

  • 为Broker支持集群部署的功能,解决针对消息生产者的高可用;
  • 支持显示无在线消费者的消费者分组,并支持删除这些消费者分组;
  • 支持删除消息时配置是否需要判断消息已经消费过;
  • 完善重置消费进度的功能,重置后可立即看到效果;
  • 采用双缓冲队列,提高Broker的性能;优化后单台Broker的性能:单发10W TPS;单收10W TPS;同时收发 8.5W TPS;消息大小为1KB;Broker配置:8核16G,虚拟机;
  • 管理控制台功能极大的完善;
  • 可配置按时间删除消息,满足用户希望消息只保存最近1天的需求;
  • 支持Pull模式,允许高级用户自己拉取消息,自己消费,自己提交消费进度;

为什么要做高可用

经过了一个多月的业余时间的努力,终于为EQueue增加了Broker的集群功能。作为一个分布式消息中间件,除了性能之外,我们还关注其高可用,高可用指的是Broker的高可用。要实现Broker的高可用,最基本的条件是Broker要支持集群部署的能力。假设一个集群内我们部署了5台Broker,然后挂掉几台,如果对Producer, Consumer都没有影响,则我们可以说Broker支持高可用。

这次发布的EQueue的版本,实现了Broker的集群部署,但是还没有实现Broker的主备。所以,在架构上来讲,支持了对Producer的高可用,但是对Consumer来说还没有实现高可用。因为如果有一台Broker挂了,则Producer可以将消息发送到Broker集群中的其他的Broker,所以对Producer没有影响。但是对Consumer是有影响的。因为此时挂掉的这台Broker上的消息在挂掉的这段时间内就无法被Consumer消费了。必须等到Broker重新起来后才能被消费。而如果实现了Broker的主备功能,则当Broker Master挂掉了,则因为Broker Slave还在,所以Consumer可以从Broker Slave上消费消息。从而可以做到对Consumer的高可用。Broker的主备功能,还能保证消息的可靠性。因为假设Broker Master的硬盘坏掉了,消息也不会丢失,因为Broker Slave上还有消息。

所以,总结一下就是:

  • Broker集群功能解决的是针对Producer发送消息的高可用;
  • Broker主备功能解决的是针对Consumer消费消息的高可用,以及消息的可靠性保证;

新版EQueue架构说明

下一个版本的EQueue将会实现Broker的主备功能。目前EQueue的高可用部署架构如下图所示:

架构说明:

  1. 总共有Producer, Consumer, Broker, Name Server四种服务器角色;
  2. Name Server的职责是负责管理所有的Broker,并为Producer,Consumer提供Broker信息以及所有Topic的路由信息;
  3. 从部署逻辑上看,Broker Master, Broker Slave是属于一个逻辑上的单元,一个Broker Master可以配置多个Broker Slave;所以,我设计了一个Broker Group的概念。同一个Broker Group中可以有一个Broker Master和多个Broker Slave;
  4. Broker启动时,
    • 与配置的所有的Name Server建立TCP长连接;
    • 定时(5s,可配置)向所有的Name Server注册自己的所有信息,主要包括:基本信息、队列信息、消费信息、生成者信息、消费者信息;
  5. Name Server之间无联系,数据无同步;Name Server也可以部署多台,由于每台Broker都会向所有的Name Server注册自己的信息,所以,理论上所有的Name Server里维护的信息最终都是完全一致的;Name Server不持久化任何东西,启动后只在内存中维护所有Broker上报上来的信息;Name Server不与其他任何服务器主动通信;
  6. Broker Slave会从Broker Master通过拉的方式同步消息,并存储到本地磁盘,消息同步为异步同步;
  7. Producer启动时,
    • 与配置的所有Name Server服务器建立TCP长连接;
    • 随机选择一台Name Server获取所有可用的Broker列表,对所有的Broker建立TCP长连接,并定时(5s,可配置)更新所有可用的Broker列表;
    • 定时(1s,可配置)向所有当前连接的Broker发送心跳,将自己的信息注册到Broker;
    • 定时(5s,可配置)从Name Server获取所有当前集群的所有Topic的队列信息;
    • 发送Topic时,如果该Topic的队列信息在本地存在,则直接从本地获取队列信息;如果不存在,则尝试从Name Server获取,如果Name Server上获取不了,则认为该Topic下没有队列信息;如果没有获取到队列信息,则会重试这个步骤5次(可配置),以保证尽量能发送消息成功;
  8. Consumer启动时,
    • 与配置的所有Name Server服务器建立TCP长连接;
    • 随机选择一台Name Server获取所有可用的Broker列表,对所有的Broker建立TCP长连接,并定时(5s,可配置)更新所有可用的Broker列表;
    • 定时(1s,可配置)向所有当前连接的Broker发送心跳,将自己的信息注册到Broker;
    • 定时(5s,可配置)从Name Server获取所有当前集群的所有Topic的队列信息;
    • 定时(每隔1s,可配置)进行消费者负载均衡,消费者负载均衡的逻辑是,针对当前消费者订阅的每个Topic,执行下面的逻辑:
      • 从本地获取该Topic的所有队列信息;
      • 从Broker集群中的第一台启动的并且可用的Broker获取所有当前在线的消费者;
      • 根据获取到的队列和消费者信息,按队列个数平均的目的为算法,为消费者平均分配队列,完成消费者负载均衡的目的;
  9. Broker的Producer心跳超时时间默认为10s;Broker的Consumer心跳超时时间默认为10s;Name Server的Broker超时时间未10s;

EQueue管理控制台

因为支持了集群功能,所以管理控制台也需要增加相应的管理功能支持。主要是要支持以集群为单位查看集群下的所有Broker列表,以Topic为单位查看每个Topic在哪些Broker上存在,以Consumer Group为单位查看每个Consumer Group下有哪些消费者,每个消费者分别正在消费哪些队列等;总结起来,目前的EQueue管理控制台支持以下功能:

  1. 查看当前有哪些集群;
  2. 查看某个集群下有哪些Broker,每个Broker的发送TPS,消费TPS,总消息堆积数;
  3. 查看单个Broker的详细信息,如监听的端口,消息存储信息,总的发送和消费TPS,Topic数、队列数、消费者组个数、消费者个数、生产者个数、该Broker上的队列信息、消费信息、生产者列表、消费者列表,最近发送的100条消息,队列扩容、缩容、重置队列消费进度,etc;
  4. 查看某个集群下的队列信息、消费信息、生产者列表、消费者列表;
  5. 查看某个集群下的所有队列的发送TPS,消费TPS;
  6. 查看某个集群下根据消息ID查看某个消息的详情;
  7. 单个集群下支持的操作:
    • 新增一个Topic,该Topic会自动在该集群下的所有Broker上创建;
    • 删除一个Topic,该Topic会自动在该集群下的所有Broker上删除;
    • Topic的队列扩容,自动在集群下的所有Broker上扩容;
    • Topic的队列缩容,自动在集群下的所有Broker上缩容;
    • 重置队列消费进度,自动在集群下的所有Broker上的该队列重置队列消费进度;
  8. 支持消息堆积报警,发送邮件;

下图为管理控制台的界面,供大家参考理解:

最后,大家对新版的EQueue的集群功能有兴趣的,可以进一步观看我之前在斗鱼上直播的视频:

https://pan.baidu.com/s/1pLlf7j9

 
分类: EQueue

EQueue 2.3.2的更多相关文章

  1. EQueue 2.3.2版本发布(支持高可用)

    前言 前段时间针对EQueue的完善终于告一段落了,实在值得庆祝,自己的付出和坚持总算有了成果.这次新版本主要为EQueue实现了集群功能,基本实现了Broker的高可用.另外还增加了很多实用的功能, ...

  2. C#分布式消息队列 EQueue 2.0 发布啦

    前言 最近花了我几个月的业余时间,对EQueue做了一个重大的改造,消息持久化采用本地写文件的方式.到现在为止,总算完成了,所以第一时间写文章分享给大家这段时间我所积累的一些成果. EQueue开源地 ...

  3. EQueue 2.0 性能测试报告

    前言 最近用了几个月的时间,一直在对EQueue做性能优化.到现在总算告一段落了,现在把一些优化的结果分享给大家.EQueue是一个分布式的消息队列,设计思路基本和阿里的RocketMQ一致,只是是用 ...

  4. c#开源消息队列中间件EQueue 教程

    一.简介 EQueue是一个参照RocketMQ实现的开源消息队列中间件,兼容Mono,具体可以参看作者的文章<分享一个c#写的开源分布式消息队列equeue>.项目开源地址:https: ...

  5. EQueue - 一个纯C#写的分布式消息队列介绍2

    一年前,当我第一次开发完EQueue后,写过一篇文章介绍了其整体架构,做这个框架的背景,以及架构中的所有基本概念.通过那篇文章,大家可以对EQueue有一个基本的了解.经过了1年多的完善,EQueue ...

  6. EQueue - 一个C#写的开源分布式消息队列的总体介绍

    前言 本文想介绍一下前段时间在写enode时,顺便实现的一个分布式消息队列equeue.这个消息队列的思想不是我想出来的,而是通过学习阿里的rocketmq后,自己用c#实现了一个轻量级的简单版本.一 ...

  7. EQueue - 详细谈一下消息持久化以及消息堆积的设计

    前言 之前写了一篇文章,总体介绍了EQueue.在看这篇文章之前如果还没看过那篇文章,可能会看不懂这篇文章.所以建议没看过的朋友务必先看一下那篇文章中所提到的各种概念,这样才能更好的理解本文所说的内容 ...

  8. 分享一个c#写的开源分布式消息队列equeue

    分享一个c#写的开源分布式消息队列equeue 前言 equeue消息队列中的专业术语 Topic Queue Producer Consumer Consumer Group Broker 集群消费 ...

  9. EQueue - 一个C#写的开源分布式消息队列的总体介绍(转)

    源: EQueue - 一个C#写的开源分布式消息队列的总体介绍 EQueue - 一个纯C#写的分布式消息队列介绍2 EQueue - 详细谈一下消息持久化以及消息堆积的设计

随机推荐

  1. jquerymobile知识点:button与a

    首先先上一段代码: <a href="#" data-role="button" onclick="change();" id=&qu ...

  2. poj 1226

    跟3294比较类似,但是不需要输出具体的串,比较简单,只要把串反转连接上去解法就一样了. #include <iostream> #include <cstdio> #incl ...

  3. AHCI vs NVMe

    http://www.hkepc.com/13139 儘管現時有不少高階 SSD 產品改用 PCIe 接口,以突破 SATA 接口的頻寬瓶頸,但控制器設計與 SATA  接口 SSD 一樣,採用老舊的 ...

  4. GUI之CCControlExtension

    Introduction CCControl is inspired by the UIControl API class from the UIKit library of CocoaTouch. ...

  5. web 版发送邮件-已删除

    文章已被删除,如果不便,敬请谅解

  6. (转载)SVN 提交操作缩写(A D M R) .

    前言: 今天使用SVN提交代码,发现提交后的代码找不到之前的版本. 操作的字母缩写为R.一般我们常见的操作为 A D M R   A:add,新增 C:conflict,冲突 D:delete,删除 ...

  7. spring 3.1.4 升 4.0.2

          来自为知笔记(Wiz)

  8. python基础知识八

    当你的程序中出现某些 异常的 状况的时候,异常就发生了.例如,当你想要读某个文件的时候,而那个文件不存在.或者在程序运行的时候,你不小心把它删除了.上述这些情况可以使用异常来处理. 如你的程序中有一些 ...

  9. IXListView的自我分析一

    XListView是一个很不错的用来刷新和加载的控件,下拉刷新和上拉加载.目前这个控件已经没有更新,这个不重要,重要的是它确实还不错,之后可能一直有人在用. android没有提供原生的这类控件,需要 ...

  10. org.hibernate.HibernateException: No CurrentSessionContext configured!

    hibernate可以通过两种方式获得Session: getCurrentSession() 和openSession(). 当通过getCurrentSession()方法时,需要在 hibern ...