• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

smartgo: SmartGo是一款集成云计算(Cloud),大数据(Bigdata),提供主流消息队列功 ...

原作者: [db:作者] 来自: 网络 收藏 邀请

开源软件名称:

smartgo

开源软件地址:

https://gitee.com/cloudzone/smartgo

开源软件介绍:

#smartgoSmartGo

smartgo整体架构图

smartgo是什么?

SmartGo是能够支持主流消息队列功能及满足物联网MQTT数千万长连接设备推送消息使用golang语言全新开发的一款分布式、队列模型的智能中间件,具有以下特点:

  • 支持point-point、pub-sub、request-reply等多种模式
  • 支持严格的消息顺序
  • 支持数百万长连接
  • 亿级消息堆积能力
  • 比较友好的分布式特性

当前最新版本功能支持:

  1. 将整个项目命名为smartgo-1.0.0
  2. 将项目中所有子工程命名为stg-*

如何开始?


开发规范必读

  • 源文件使用Unix换行、UTF-8文件编码,遵照golang内置格式化代码规范
  • 请在git clone命令之前执行git config --global core.autocrlf false,确保本地代码使用Unix换行格式
  • 请在非主干分支上开发,禁止提交本地未测试运行通过代码到线上分支
  • 每次提交及之前(正常来说需要先pull --rebase,解决冲突),对代码进行修改必须有相对应的解释说明
  • 正常组内开发人员提交代码,需要经过经过审核后方可提交(且需要有统一格式注释,参照注释类型3)

原始文档请参考:smartgo/docs/doc/目录:

SmartGo文档截图示例:

SmartGo-Store:

SmartGo-Broker:

SmartGo-Net:

SmartGo-Register:

SmartGo-Client:

Markdown文档概述(由于Markdown格式会缺失图片,细节请参考原始文档)

SmartGo-Store技术文档说明

针对版本V1.0.0

©

成都基础平台架构

2017/11/21

目 录

1 存储 4

1.1 概述 4

1.2 零拷贝技术 4

1.3 CommitLog 4

1.4 ConsumeQueue 7

1.5 索引 9

1.6 主从同步 11

1.7 刷盘 13

1.8 文件清理 13

附件一Smartgo开发者联系方式 15

  1. 1存储
  2. 1.1概述

存储模块主要包含存储Producer生产的消息、ConsumeQueue、索引等数据以及主从同步、刷盘、清理服务等。

  1. 1.2零拷贝技术

零拷贝是通过将文件映射到内存上,直接操作文件,相比于传统的io(首先要调用系统IO,然后要将数据从内核空间传输到用户空间),避免了很多不必要的数据拷贝,提高存储性能。存储消息,使用了零拷贝,零拷贝包含以下两种方式:

方式优点缺点
mmap + write即使频繁调用,使用小块文件传输,效率也很高不能很好的利用 DMA 方式,会比 sendfile 多消耗 CPU,内存安全性控制复杂
sendfile可以利用 DMA 方式,消耗 CPU 较少,大块文件传输效率高,无内存安全新问题小块文件效率低于 mmap 方式

SmartGo采用mmap+write方式,因为有小块数据传输的需求,效果会比sendfile更好。

  1. 1.3CommitLog

CommitLog用于存储真实消息数据。CommitLog路径默认为用户工作目录/store/commitlog。

CommitLog存储目录结构:

commitlog

    - 00000000000000000000    - 00000000001073741824

commitlog文件名生成的规则:

文件名的长度为20位,左边补零,剩余的为文件起始偏移量(第一个文件起始偏移量为0);

文件名字根据指定commitlog文件大小(默认文件大小为1G,可以通过MessageStoreConfig的mapedFileSizieCommitLog进行配置)递增,文件大小单位为字节。

例如:

默认commitlog文件大小为1G=1073741824b

第一文件的起始偏移量为0,不足20位进行补零,故文件名00000000000000000000,当第 一文件写满,第二文件的起始偏移量为1073741824,不足20位进行补零,故文件名为00000000001073741824,后面的文件名以此类推。

文件n起始偏移量 = size * (n- 1)

文件1起始偏移量 = 1073741824 * (1 - 1) = 0

文件2起始偏移量 = 1073741824 * (2 - 1) = 1073741824

通过commitlog文件名能够方便快速定位信息所在的文件。

文件Index = (消息的起始物理偏移量-最早的文件的起始偏移量)/文件大小,即 (1073741827-0)/1073741824=1,可得知该消息在队列中的第二个文件中:

commitlog文件的消息结构:

序号字段说明字节数备注
1TotalSize消息总长度4
2MagicCodeMagicCode4MagicCode分为:MessageMagicCode、BlankMagicCode。MessageMagicCode表示正确的消息内容;BlankMagicCode表示CommitLog文件空间不足,采用空字节占位写满文件。
3BodyCRC消息内容CRC4BodyCRC的值是对消息内容(body)进行CRC32生成的32bit冗余校验码,用于确保消息的正确性。
4QueueId消息队列编号4
5Flag消息标志4
6QueueOffset消息队列位置8自增值,消息队列逻辑位置,通过该值才能查找到consume queue中的数据;QueueOffset * 20才是消息队列的物理偏移量。
7PhysicalOffset物理位置8
8SysFlagMessageSysFlag4
9BornTimestamp生产消息时间戳8
10BornHost生产消息的地址+端口8
11StoreTimestamp存储消息时间戳8
12StoreHost存储消息的地址+端口8
13ReconsumeTimes重新消费消息次数4
14PreparedTransationOffset8
15BodyLength消息内容长度4
16Body消息内容bodyLength
17TopicLengthTopic长度1
18TopictopictopicLength
19PropertiesLength附加属性长度2
20Properties附加属性propertiesLength

添加CommitLog数据,将数据写入到MapedFile,每个MapedFile对应着一个储存消息的二进制文件,MapedFile在创建时会映射到内存上,添加消息时将需要保存的数据写入内存,后续有刷盘服务会将内存中数据持久化到二进制物理文件中,下图是添加CommitLog数据的主要业务流程:


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap