首页 技术 正文
技术 2022年11月6日
0 收藏 631 点赞 1,519 浏览 34042 个字

回到目录

关于持久化到Redis的消息格式,主要是说在Broker上把消息持久化的过程中,需要存储哪些类型的消息,因为我们的消息是分topic的,而每个topic又有若干个queue组成,而我们的topic和queue由于redis存储结构的原因,我们需要将它们分区对应存储一下,而不能像关系型数据库那样灵活,所以要额外设计几个数据结构来存储它们。

一 Topic字典

二 Topic对应的Queue字典

三 Queue里的消息

四 某个客户端对应某个Queue的消费进度

以上四个结构是我们要说的,它们会在推消息,拉消息,删消息时用到,下面一一介绍一下,讲的不好不对的地方,欢迎大家为大叔留言。

一 Topic字典

主要存储每个topic,它是一个set集合,redis的我集合类型之一,每个key是唯一的LindMq_Topic,值value就是我们客户端传来的具体topic的名字,这主要是在删除过期的消息时用的,主是作用是遍历所有的topic消息类型,这样我们在删除消息时,就可以把所有注册的topic都找到了,最后把过期的删除,默认消息存活周期是一天。

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUIAAAB0CAIAAAB/m6zPAAAEqklEQVR4nO3dTXabSBQGUJbWG9Ceek1eRYYZeC2Zqgd2E1x/lASIeuje804OwkA9OXxSBSnSdAeCm85uANhKjCE8MYbwxBjCE2MIT4whPDGG8MQYwhNjCE+MITwxhvDEGMJ7UYz/BXZyZoz/ATb7/P3r5Bi/Ziy4MDGG8MQYwhNjCG89xtOa4jY9Yy9j3N6x84DLQyXHTI7f2eQTd6p4kOd2hE4rMc5P/WIYpmn6+PiYpul2uz0X4/uup3uxw+XKzhHnffdtD/b1QIxra5Y/ut1u/WOfEuP87vQfDcbUO6nObxYTvozx6ly0J8b5QdoNNOYLO8a4OEqt1cbuHiDYRdclruU5Vztl78fEuPijJEL5NsnK/M+eQRuj1wZa3b69JTzngSvVSXpXY7xqS4zz5Ygxhl08H+PiBlFivHwwWu1TjBncPleq55t7TaqfmJd2xri2S4NJNYPrinFbvmWypjZ28XXjxmHnNNYeSmrtLXfs7C3/DbRX5p0Xm390dOjx1u/i2jFLMsmJ3jrGs9pc4NHdD2oP2sQYwjs5xp+/fymlttdpMQaOI8YQnhhDeGIM4YkxhCfGEJ4YQ3hiDOGJMYQnxhCeGEN4Ygzhfcf41V/tCOznb4wP/0ZH4Bg/YnzOhKBpzK5gKGmMT/+/lMsasyulRisxVip8ibFS4UuMlQpfYqxU+LpyjOcPoz39jih1aF05xt/3UIzV1UuMlQpfrRjPM9JkappMVpeb5Rtvqbyr5dDFNvKh887z5cbuSo1fK8/G+ZmdnPrLheWfu1TtwaXWQL7cvtmzu1Lj13qMG2vGifF8s/240+h/6fS/FaUeqngxrg1UfGpt36ztolSs2ifGnwdk+PORGJtUq3eu9UtcxWlqbe76mhgXB8onxrWpcnG9GbWKW9d/wUmpy5cYKxW+xFip8CXGSoWvNMYHfuzXU8bsCobiI/UgvNE/Ug9YJcYQXjnG0zT0t0l8vU/j7C5gFIUYhwjJ+B3Cy4R8Nr5H6BBeJkaMk3dB3//vMJk45JvBOwgT43yhuDJZgHcQI8Zfkife4nJ+Ey5PjCG8MDFOJsyrkR7wLsBBqi84DRWDqWL503yzU1uG1/EuLghPjCE8MYbwxBjCE2MI70eM/wABiTGEV4jx/LrruZ1tsb3/5CXonu2PaAN6pDFennahT8Htze/yqwj9OyQKMe46ghgzsta/jYc6BZP57bycTFzzmXA+Ma7tm4+YL9eOlhznoQk5bFSN8VDnXyNR7c1qz6g9ASs+IhSP1h6oPQpsV47xaCdfLcarm00/FbfsGTRZ3/MI0j8QbFS+Un1uT7ktMV49YM+gq6OLMSdqXeIaxy4x3v5sbFLNmAoxHvPyTP7P1NrkNvlRcUa9egdrGzSOX2tvqF8jl+RdXBCeGKfPnJ48CUeMITwxhvDEGMLzsQEQnhhDeDE+p7pT3M5hizTGU/1LVaII2jY8rTWpDpqHoG3D06rf4TRUGJK3ZxTXLDc+qU04R4xn4yn7grV8Id8Y3kSMGH/pTOxobcPRxBjCC3Olun9ePVTb8AIxXjfuvMTVuO4FF+ZdXBCeGEN4YgzhiTGEJ8YQno8NgPD+A4zNhI48n/bUAAAAAElFTkSuQmCC” alt=”” />

删除过期的消息代码如下

 var topicList = RedisClient.RedisManager.Instance.GetDatabase().SetMembers(LINDMQ_TOPICKEY);
foreach (var topic in topicList)
{
var queueList = RedisClient.RedisManager.Instance.GetDatabase().SetMembers(LINDMQKEY + topic);
foreach (var queue in queueList)
{
 var removeKey = LINDMQKEY + queue + "_" + DateTime.Now.AddDays(-).ToString("yyyyMMdd");
  RedisClient.RedisManager.Instance.GetDatabase().KeyDelete(removeKey);
}
}

二 Topic对应的Queue字典

我们知道,为了加大redis的并发量和吞吐量,我们会把大数据键值对设计成多个键,这就像是一个集群环境的sharing,就是将大数据进行分片,而我们的分片规则是采用按对象取模的方式,模数可以自己设置,比较我设置8,那说明我的队列(分片)最多可以被分为8个,这个大家可以去做测试,挺有意思的,比随机数来个直接!而这一次redis里的键就是某个topic,而值就是我们的topic加上队列索引,例如你的topic是zzl,那么队列里的键可能就是zzl0,zzl1,zzl2…

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAU8AAABhCAIAAADZfrRXAAADk0lEQVR4nO3dS3LaQBQFUC0tG2BPWZNXkQGDDLwMjzN1Bk5RHfVHLdP68c6pWy4QQt2q+EIXEDzd7/dPOJ87o013beeUPj4+jp7Cq9F2iELbIQpthyi0HaLQdohC2yEKbYcotB2i0HaIQtshCm2HKLQdotB2iGLvtv8EBlnbvgPa/gN42vvvX2vbd0zb9xwRXpK2QxTaDlFoO0QxrO3TkuI+PeOlbW/fsfOA6aFmx5wdv3+SqwYde0zoNKbteUOKnZmm6e3tbZqm2+32vbZ/rqx0W3GG6cbhI250QOgxvu21LelNt9utf7xD2p6fzqhBhx8NOg1eyedXiw8EadsXF7c9bc8P0p5AY/XxjbZP/2ts7DkabGTkq3Tpb3b7d31424s3zbqX7zPbmP/sGbTz4P1Hg42Mf01+VvLFti96pu355S3a3tinfyNsbfO2F3e4StvTx6zFeWo7J7fra/KPq6NW8u1n4GfaXrtLzarFvLZziJFtb8v3nG2pjVd8v71x2Cl5Wi4+4tSml96xc2610VdthH34LN0yzeQ1aPsKtZUFXIK2QxTXaPv7718i8nzWts/30kEU2g5RaDtEoe0QhbZDFNoOUWg7RKHtEIW2QxTaDlFoO0Sh7RDFvO17/01aYC+Ftm/+p2iBI5TbvseqYqVzzgoupNr2w//vbppzzkrkWtF2kSjRdpEo0XaRKNF2kSgJ0fbHd0gffiIiByZE2/+dqrZL7Gi7SJR0tf2xDJ6th2cr5HS3fOdnks8qHbo4jXzofOb55cbdRa6e3uf2vACzhqQX0p9DUnsMqk0gv9y+2nN3katnRdsbW87T9sfV9sNTY/6pw/95RAbmwm2vDVR8om5frd1F5JUyuO3vG1T9fU3breRFalnxKl1xbVxbMO/T9uJA+Wq8tj4vbreMl1dNoHfgRIJH20WiRNtFokTbRaKk2vYNvwvvW845K7gQ30IJUVzmWyiBJ2k7RLHQ9mmadp/SAI9PyBRv2n8+cAatttcKcxX55K9+RvCM13xu/zKb/NfVS58RPONibZ99sr24Jd05v3y2M4LdXK/tixfyndu7QRAXa/uXdrHzjcXaQzQh2v75/4J/28nBWV2v7f2Lee/AQWr5HbhT1aPzVbraS3cnPCPYjc/SQRTaDlFoO0Sh7RCFtkMU5bb/AV6OtkMU2g5RaDtEoe0QhbZDFNoOUWg7RKHtEIW2QxTaDlFoO0TxF9RUbEnCWMRJAAAAAElFTkSuQmCC” alt=”” />

三 Queue里的消息

我们的生产者将消息发送到broker里,然后于broker将消息持久化到具体的存储介质里,当然这里我们用的是Redis,在存储在redis里时,我们的具体队列的键是有后缀的,这主要用于消息的回收,因为我们打算1天回收一次消息,所以我们的消息后缀是个日期变量,当然精确到天就可以了,它可以是这样键名LindMQ_order_Paid4_20161202,每个队列都有自己的后缀,我们在清除消息时也就有了方法了。我们的队列存储结构是比较特殊的sortedSet ,就是可排序的集合,它有权重的概念,我们刚好可以使用这个特性来记录客户端的消费进度,因为我们的权重值在一个redis键/值对里是唯一的。

aaarticlea/png;base64,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” alt=”” />

下面代码选自Push入队列的代码片断,分享给大家

       //存储当前Topic
RedisClient.RedisManager.Instance.GetDatabase().SetAdd(LINDMQ_TOPICKEY, body.Topic); //要存储到哪个队列
body.QueueId = Math.Abs(body.Body.GetHashCode() % BrokerManager.CONFIG_QUEUECOUNT);
var dataKey = body.Topic + body.QueueId;
RedisClient.RedisManager.Instance.GetDatabase().SetAdd(GetRedisKey(body.Topic), dataKey); //记录偏移
var offset = RedisClient.RedisManager.Instance.GetDatabase().SortedSetLength(GetRedisDataKey(dataKey));
body.QueueOffset = offset + ; //存储消息
RedisClient.RedisManager.Instance.GetDatabase().SortedSetAdd(
GetRedisDataKey(dataKey),
Utils.SerializeMemoryHelper.SerializeToJson(body),
score: body.QueueOffset);

四 某个客户端对应某个Queue的消费进度

消费进度是一个很麻烦的问题,生产者的消息是可以被多个消费者消费的,所以不能使用.net那种简单的Queue机制,出队列后就消失了,这是不靠谱的,万一消失失败了,也会造成消息的丢失!下面我们主要看一下消费进度的存储,它是一个Hash集合,其中redis的键名是LindMQ_ConsumerOffset,而value是一个hash对象,hash里的key是当前队列名+消费者IP地址的hashcode值,hash里的value是这个消费者(客户端)的消费进度(Queue里的权重,Queue的存储结构是一个sortedSet)。

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAWQAAABrCAIAAADPWG8WAAAHN0lEQVR4nO2dS5bkKAxFvbReWi+g9lFbyUEOalBryal70N0uJ0jiGWMw9r1Hp46DkJHA4pn4VOSyruvn5+cKABCyrIgFAAggFgAggVgAgARiAQASiAUASNxCLP4GgCp6rtO7iMVfAHCQ378+eq7TG4nF2BwApgOxAAAJxAIAJBALAJAYLxbL//z48WPZsT1lOu/JT4zZi0V8ltJbklvSZ9K/mOH6faR6Dv3xMjSTn2JE4FEtFmYxF8vA3ll4yynvPXmqbh0mO4uGtZsnk2QoRjw0pwPxRmS268OPY8Eo6sSiupgPiMWyLD9//ozlYCKx8JZT0MnNCUbk7TUahoP+nBeLYyeuJ8RizRQh3pJ4WSpikfdgbhYS56vFohjFSyk4y5wrZfjmiMw+lUB5LOV06MmZlyHJw7gS/qul1ReL1NUSiySSeaKXzYa+szBDJ08lVb4/yP+tCGq2JyPVUyrm6XkmseIRmUPIG/U8vT6hJ2fe4DQXsvnwz8F6ZGcRrHlPIJS8z4hFMLa8sY9YeA568rlYmJMvXmxvCMF1zFuK0aE/5z8NOVQkqlgUVWBSsdiSvFos4meLYqEk1kQsxHPj06EPM4mFrin5fWlPIBYV66FiERbr/migk42BWIhiFM9b8fS66NCZtp+GFMvJEIttYSdflzBbTLwvaChikfdmtud9Bs77UzxPZYpzTy/JJKV8OOfzjPv0olQ0BrMkTh1cRLVYeHUbN9o7i84M/wYnRQ8zMv4bnP0ZLhYb5n0e4J4gFgAg8VKx+P3rA8Owo9Zznd5CLADg/iAWACCBWACABGIBABKIBQBIIBYAIIFYAIAEYgEAEogFAEggFgAggVgAgARiAQAShlj0/qPxADADtlhc/rfiAWA2XLG4fE9znHtmBUOgGPoTicXw/6u/t3tmhQ0ximGIIRbYfEYxDDHEApvPKIYhhlhg8xnFMMQQC2w+oxiG2MRi8e9P9Q9PDOtvJ0t0+zsPwwcyl00sFr9/fXC932lNSpTiOTxjiAU2nSEWQ0wVi23bluzfkh3d3i13PmOBWOS7SjMrzxmbzrzXpOYl9q54XjD5cXD6C+3AziKfsmRO9wf7f5tYvLMwM1EcsBmtuM1UrrtezKb/C+2YWAQtA8Uiv+p7YmdsRtPFYnsY3+q8071aeqdNLxbFIkjaueQPsLhEvXo4ubPA2ouFd81O2smXId4QsBlNFwtehjS0Y29wmrdx795+tVjsQ+evOMx9I9f7GRZ8GmJe9KR6vRcXZjuvQf7Mz9QfnR4bKtf7KXbPEn28vUIsuDk8zO5Zoo+3V4gF9jCjGIYYYoHNZxTDEIvEotkPfTbinlnBECiG/vCDvQAgMdMP9gLAQBALAJAoi8WyLL2T8tk+BDWfOtRJ0lt+fHXCYs65j9mSRym6Jd9Bijusa+nAkKDvpCAWN7wMTfJJFkxy0DBQ0JUyt94y9jrPxxW4FSVMOTB761YzQ4K+lsl2FuvFYlG8OZ8Ml7Qo/Xvnmg/FxRNEL4bzAiEWj+cJYuHth/cHied5sVi+EzTm/Zj350Pj9R4WF4+XbXJW4rZaM+kNp2fBIBY9eYJYmO1muefO+6eOikXu46lAH7GIFSo/xcs8kIniqPM5vBRv7HAFTxaL5LitWAQO8fI+ejMsisX6fX+kdB70eWjeim4dMMcOV4BYGGKh11+FWGz9izdDRSzMp6p3Fg3denK3Qn0ec4tFUKB1YpE/pWQiLqd4LMUoXouX8JkJaeV2NfrFgvMUxEK/AfZhycgb1yxtz3PfbrrpmXiNplvirEQ51KI3dnC7lP4R30x5Z/FaqEKAPYhFmSVjrv4BmoBYAIAEYgEAEogFAEi4YvEFALADsQAAiYJYbO/Pj81yI8hHT3LrYd9bflyX2yFnxT/3MVvy3opuyUcwcYd1LVcTDAGaE4lFUgfjkvxGk0ySBZMcVAcST9En1lvGxd4UNy90PgPBgdlbt2q5T1m+AcTim1gUb87NcyueYm4QvIfiJQvEohjOC4RYPB71PYv7XBWzms398P4g8TwvFuYGOA9quiWhK8brPSyuWC+35Kx4UF6gQIMuwptbuAJJLG51JbxkgqUY3Pr2Tx0Vi9wnCCqmrTh4SQbr2ezBm5BY+/LOc/WJR9QQcbzQhLJY3O0a6GKRHLcVCzFosZ/zYvH1fX9UFzRQgWDeim49uVuhPo/ypyFj88vpIBbm2qsLGudcEULvrXpn0dDtaoYr1KtQ3+C8D+KCrBOL/Cklk+LmXHErRvFavITPTEgrt6tBLHpSEIs9o1P9+spS2m8EzJb9WebpiUyYpyuZeEG9ORRnVTnR7Eps7OB2NUOCvhO+welCCQLsQSzKBBuEKfoHaAJiAQASiAUASCAWACDBj98AgARiAQASiAUASCAWACCBWACABGIBABKIBQBIIBYAIIFYAIAEYgEAEogFAEggFgAggVgAgARiAQASiAUASPwDwQoLTDg5Vb0AAAAASUVORK5CYII=” alt=”” />

客户端消费的测试代码

            #region Client-LindMQ
var consumer = new ConsumerSetting
{
BrokenName = "test",
BrokenAddress = new System.Net.IPEndPoint(IPAddress.Parse("192.168.2.71"), ),
Callback = new Dictionary<string, Action<MessageBody>>() {
{"zzl",(o)=>{
Console.WriteLine(o.ToString());
Thread.Sleep();
}},
{"zhz",(o)=>{
Console.WriteLine(o.ToString());
Thread.Sleep();
}}
}
};
var consumerClient = new ConsumerManager(new List<ConsumerSetting> { consumer });
consumerClient.Start();
#endregion

客户端消费的测试结果

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAi4AAADACAIAAACs+X9TAAAgAElEQVR4nO19adhlRZHm+du2PaO29rQ44yigoiibLCqrgGKzryKF7KCsVVQVstZeBVRRBVSxyy47IvsmAnrVnhZkaVG7lbbR6W4HeuZRZK2FxTs/8tap/DIyIt/IzHvvt8T7nMcnb9zIN96IyI/wfPd8t5p3rHts4fWXHzn2Lz9ynLve+dHj3vnR49/50ePf+bHj/6p3nfBX653wX9z18cn/tb0+MeVd7lp/yrvWn/Lu9U989/onvvuTJ777kye+55NT3/Opqe/51NS/dtcG0/56g2nv3WDaezec9t4Np793w+nv23D6+zaa/r6NTnrfRif9zUYn/c3G7vrGf9ukd/3tJif/7ad71/s3Pfn9m57irrU2O2WtzU5da7NT19r81A9sfuoHNj/tA5uf9t+3WH195vT/0V6fPeOD7vrcGR/83Iz/6a4tZ3xoyxkf2nLmh7ac+aGtZn54q5kf3mrWh7ee9eGtZ63trm1mr73N7HW2mb3OtrPX2XbOOtvOWXfbOetuN2fd7eZ+ZLu5H/l87/ro5+d9dPve9bEd5rfXejvOX2/HBevtuODjX3DXmR//wpmf+KK7zvrETmet315fOvuTq69P/d3C3rXzwg12XrjBzos22HnRBrss2nCXRRvucs6Gu56z4a7nbLTrORvtunij3RZvtNvijXdbvPHuizfefckm7tpjySZ7nPvpPc799J7uOm/TPc/bdK/etdne57tr873P33yfpe7aYp+lW+y7dIt9l22x77LP7OeuCz6z3wWf/bK7Lvzc/muuLb9yUe864KKtDri4d026eOtJF2896ZKtD7xk6wMv2ebAS7Y58NJtvnrptu466LJtD7psO3cdfNl2B3/z8wd/8/OHuOvy7Q+5fPtDL9/+0Mt3OPTyHQ69YofDrtjhsCt2POyKHQ+/0l1fOPzKLxxxlbu+eKS7rt7pyKt3Ospd13zpa+117d99ffV19LU7H/2t3nXMt3Y55rpdjrlul2Ov27V3Xb/rcdfv1rtu2O34G3Z31wk37n7CjXu4a/KNe06+ac/JN+055aY9p9y015Sb95py814n3rzXiTfvfeLNe0+9xV37TL1ln2m37jPt1n2n3brv9Fv3nf7tfad/e7/p397vJHfd9uVvtNd39j95zfWVU253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” alt=”” />

好了,到这里我们的LindMQ里数据存储结构的内容就讲完了,主要使用了redis里的set,sortedSet,hash等数据结构,在设计过程中,使用了分片(Sharing)的概念,当然也是借鉴了mongodb和redis集群的设计理念,同时借鉴了方雪华老兄的EQueue设计理念,在这里和他们说一声:谢谢!

感谢各位对Lind的支持!

回到目录

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,082
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,557
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,406
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,179
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,815
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,898