在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:smartgo开源软件地址:https://gitee.com/cloudzone/smartgo开源软件介绍:#smartgo smartgo整体架构图smartgo是什么?SmartGo是能够支持主流消息队列功能及满足物联网MQTT数千万长连接设备推送消息使用golang语言全新开发的一款分布式、队列模型的智能中间件,具有以下特点:
当前最新版本功能支持:
如何开始?开发规范 |
方式 | 优点 | 缺点 |
---|---|---|
mmap + write | 即使频繁调用,使用小块文件传输,效率也很高 | 不能很好的利用 DMA 方式,会比 sendfile 多消耗 CPU,内存安全性控制复杂 |
sendfile | 可以利用 DMA 方式,消耗 CPU 较少,大块文件传输效率高,无内存安全新问题 | 小块文件效率低于 mmap 方式 |
SmartGo采用mmap+write方式,因为有小块数据传输的需求,效果会比sendfile更好。
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文件的消息结构:
序号 | 字段 | 说明 | 字节数 | 备注 |
---|---|---|---|---|
1 | TotalSize | 消息总长度 | 4 | |
2 | MagicCode | MagicCode | 4 | MagicCode分为:MessageMagicCode、BlankMagicCode。MessageMagicCode表示正确的消息内容;BlankMagicCode表示CommitLog文件空间不足,采用空字节占位写满文件。 |
3 | BodyCRC | 消息内容CRC | 4 | BodyCRC的值是对消息内容(body)进行CRC32生成的32bit冗余校验码,用于确保消息的正确性。 |
4 | QueueId | 消息队列编号 | 4 | |
5 | Flag | 消息标志 | 4 | |
6 | QueueOffset | 消息队列位置 | 8 | 自增值,消息队列逻辑位置,通过该值才能查找到consume queue中的数据;QueueOffset * 20才是消息队列的物理偏移量。 |
7 | PhysicalOffset | 物理位置 | 8 | |
8 | SysFlag | MessageSysFlag | 4 | |
9 | BornTimestamp | 生产消息时间戳 | 8 | |
10 | BornHost | 生产消息的地址+端口 | 8 | |
11 | StoreTimestamp | 存储消息时间戳 | 8 | |
12 | StoreHost | 存储消息的地址+端口 | 8 | |
13 | ReconsumeTimes | 重新消费消息次数 | 4 | |
14 | PreparedTransationOffset | 8 | ||
15 | BodyLength | 消息内容长度 | 4 | |
16 | Body | 消息内容 | bodyLength | |
17 | TopicLength | Topic长度 | 1 | |
18 | Topic | topic | topicLength | |
19 | PropertiesLength | 附加属性长度 | 2 | |
20 | Properties | 附加属性 | propertiesLength |
添加CommitLog数据,将数据写入到MapedFile,每个MapedFile对应着一个储存消息的二进制文件,MapedFile在创建时会映射到内存上,添加消息时将需要保存的数据写入内存,后续有刷盘服务会将内存中数据持久化到二进制物理文件中,下图是添加CommitLog数据的主要业务流程:
请发表评论