`
DiaoCow
  • 浏览: 245387 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

TinyMQ学习(1) 概述

阅读更多
最近在学习erlang,了解了下它的基本语法以及相关特性,但是一直没有比较大的进展.前天在微博上无意中发现一个用erlang写的迷你的消息队列TinyMQ(源代码文件不足50K),这激发了我极大的兴趣,抱着学习的态度,下载了作者的源代码(https://github.com/evanmiller/tinymq)进行了研究学习,收获还是蛮大的,至少了解到:
1.如何用erlang实现一个简单的消息队列(我想这也是大家最感兴趣的地方);
2.如何使用erlang otp;
3.对之前学习过的erlang语法有了更深入的理解;


下面我就和大家一起来学习TinyMQ,在开始之前,先做好以下准备:
1.了解erlang的基本语法,参考文档:http://www.erlang.org/doc/getting_started/users_guide.html
2.了解erlang otp,参考文档:http://www.erlang.org/doc/design_principles/users_guide.html
3.了解消息队列相关概念,譬如常见的消息模型(ptp:点对点,pub/sub:发布/订阅)
4.了解rebar(只要知道如何编译代码即可)


在具体查看作者源代码之前,我们先看看程序运行效果:



其中:
application:start(tinymq) 表示启动了一个tinymq服务
subscriber:start(3)  表示启动了3个process去订阅某个topic
publisher:start() 表示启动了1个process去往topic发消息(每5秒一次),消息的内容是{"hello erlang", 当前时间}
之后我们就可以看到3个订阅者,每隔5秒就能收到publisher发布的消息

ps:subscriber与publisher是我自己后来额外加的代码文件,用来测试作者的TinyMQ,代码中调用了TinyMQ提供的接口


看完了执行效果图,我们来具体看下TinyMQ:
TinyMQ是一个基于channel的消息队列(什么是channel,我们稍后会说),它的所有消息都保存在内存中而不做持久化(如果可以持久化,那么代码远不止50K),并且每一条消息都有一个超时时间(所有消息保存在一个类似AVL树结构中),
TinyMQ实现了基本的发布/订阅功能(当然还有其他功能),其订阅端逻辑如下:



首先客户端发送一个订阅请求subscribe request:{Pid, Channel}给mq_server,当mq_server接收到这个消息后,首先检查是否已经存在一个名为Channel的服务(mq_server内部维护着一个{Channel名,Channel服务Pid}的列表)如果不存在就新创建一个,接着把这个订阅请求交个这个Channel服务处理,Channel服务到底包含些什么呢?Channel服务内部维护着一些重要的状态:
1.Channel名(其实就可以理解为我们常说的topic);
2.消息队列(用来存放消息);
3.消息超时时间;
4.订阅者列表(对于一个新的订阅请求,会往订阅者列表中加入新的订阅者);
5.上一次清理消息队列中超时消息的时间(清理间隔不小于1秒);


看完了订阅端,我们在看看发布端:



首先客户端发送一个发消息请求{Pid, Channel, Message}给mq_server,当mq_server接收到这个消息后,同样会检查是否存在名为Channel的服务(若不存在则新创建),接着把这个请求交给相应的Channel服务处理,Channel服务接收到这个请求后:
1.把消息发送给这个Channel的每一个订阅者(之前我们说过,每一个Channel服务维护着一个订阅者列表);
2.删除消息队列中超时的消息;
3.把消息插入到消息队列中;

从这两个图我们还可以看出mq_server在整个流程中充当着类似代理的角色(派发客户端请求),而真正处理客户端请求的实际上是Channel服务(mq_server负责维护一个包含所有Channel服务的列表)


最后我们在看下TinyMQ的supervision tree模型(矩形代表supervisor process,圆形代表worker process)



可以看出所有的Channel服务都是被一个叫做TinyMQ_Channel的监控者监控着,如果发现某个Channel服务crash了(可以理解成某个topic挂了),那么监控者会重启这个Channel服务,只是这个Channel中的所有消息,订阅者列表以及一些其他信息都将丢失。如果要保证不丢失,我们可以把Channel的状态以文件的形式记录下来,当下次重启Channel服务的时候,首先去读取相应的文件,恢复上一次状态,这样就可以保证Channel服务状态不丢失(并不是严格意义上的不丢失,并且这样的话,源文件肯定不止50K了),同理TinyMQ_Server process.

至此关于TinyMQ我们已经有了大致的了解,下一节我们将具体看下作者的源码。

另外,我自己第一次编译源代码文件的时候,报出以下错误信息(依赖不可用):
引用
==> tinymq-master (compile)
Dependency not available: tiny_pq-.* ({git,
                                       "git://github.com/evanmiller/tiny_pq",
                                       {tag,"HEAD"}})

为了简单起见(自己不是和熟悉rebar),我自己去下载了tiny_pq.erl文件(https://github.com/evanmiller/tiny_pq),放到源代码目录中,然后把rebar.config删除,重新编译OK



ps:本人水平有限,若哪里说的不对或是不清楚还请点出,谢谢^_^


  • 大小: 85.8 KB
  • 大小: 65 KB
  • 大小: 61.2 KB
  • 大小: 43.5 KB
分享到:
评论
3 楼 DiaoCow 2012-12-03  
thomescai 写道
没运行 ./rebar get-deps  吧?

感谢你的回复,确实运行你说的命令就可以了,自己还需要在学习下rebar
2 楼 thomescai 2012-11-30  
没运行 ./rebar get-deps  吧?
1 楼 thomescai 2012-11-30  
没运行:./rebar get-deps  吧?

相关推荐

    tinymq:TinyMQ是建立在bbolt之上的小型轻量级持久队列

    TinyMQ TinyMQ是建立在bbolt之上的小型轻量级持久队列。安装go get github.com/superiss/tinymq例子文件经纪人// Brokertype Broker struct {mu * sync. Mutexdb * bbolt. DBqueues map [ string ] * Queuenotify ...

    基于 OpenCV 的魔兽世界钓鱼机器人

    基于 OpenCV 的魔兽世界钓鱼机器人

    供应链管理中信息共享问题的研究.docx

    供应链管理中信息共享问题的研究

    青春文学中的爱情观呈现.doc

    青春文学中的爱情观呈现

    分布式光伏储能系统的优化配置方法 附Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    Delphi 12.3 控件之XLSReadWriteII6.02.01.7z

    XLSReadWriteII6.02.01.7z

    图解系统-小林coding-v1.0.rar

    图解系统-小林coding-v1.0

    【光伏功率预测】基于EMD-PCA-LSTM的光伏功率预测模型 附Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    漫画作品与乌托邦理想追求.doc

    漫画作品与乌托邦理想追求

    江苏建筑消防设施维护保养规程.rar

    江苏建筑消防设施维护保养规程.rar

    基于交互式可视化的Transformer模型注意机制探索工具-DODRIO及其应用

    内容概要:论文介绍了一款名为DODRIO的交互式可视化工具,帮助自然语言处理(NLP)研究人员和从业者解析基于转换器架构的语言模型内部工作机理。DODRIO整合了概述图与详尽视图,支持用户比较注意力权重与其输入文本的句法结构和语义特征。具体而言,它包含了依赖关系视图(Dependency View)、语义关注图(Semantic Attention Graph)以及注意力头概览(Attention Head Overview),并利用不同的图形展示方法使复杂的多层多头转换器模型中的注意力模式更容易理解和研究。 适用人群:适用于从事深度学习、自然语言处理的研究人员和技术从业者;尤其适合对基于变换器架构的大规模预训练语言模型感兴趣的开发者们。 使用场景及目标:DODRIO用于探索转换器模型各层级之间的联系、验证已有研究成果,同时激发新假设形成。具体使用时可以选择特定数据集中的句子作为样本输入,观察不同注意力机制如何响应文本内容的变化。此外,还可以用来对比精简版本DistilBERT的表现,评估其相对全量模型BERT的优势与不足。 其他说明:DODRIO为开源项目,提供web端实施方式,使得

    基于机器学习的疾病数据集分析

    该代码使用scikit-learn的乳腺癌数据集,完成分类模型训练与评估全流程。主要功能包括:数据标准化、三类模型(逻辑回归、随机森林、SVM)的训练、模型性能评估(分类报告、混淆矩阵、ROC曲线)、随机森林特征重要性分析及学习曲线可视化。通过`train_test_split`划分数据集,`StandardScaler`标准化特征,循环遍历模型进行统一训练和评估。关键实现细节包含:利用`classification_report`输出精确度/召回率等指标,绘制混淆矩阵和ROC曲线量化模型效果,随机森林的特征重要性通过柱状图展示,学习曲线分析模型随训练样本变化的拟合趋势。最终将原始数据和预测结果保存为CSV文件,便于后续分析,并通过matplotlib进行多维度可视化比较。代码结构清晰,实现了数据处理、模型训练、评估与可视化的整合,适用于乳腺癌分类任务的多模型对比分析。

    数字化智慧园区建设实施PPT(43页).pptx

    在智慧城市建设的大潮中,智慧园区作为其中的璀璨明珠,正以其独特的魅力引领着产业园区的新一轮变革。想象一下,一个集绿色、高端、智能、创新于一体的未来园区,它不仅融合了科技研发、商业居住、办公文创等多种功能,更通过深度应用信息技术,实现了从传统到智慧的华丽转身。 智慧园区通过“四化”建设——即园区运营精细化、园区体验智能化、园区服务专业化和园区设施信息化,彻底颠覆了传统园区的管理模式。在这里,基础设施的数据收集与分析让管理变得更加主动和高效,从温湿度监控到烟雾报警,从消防水箱液位监测到消防栓防盗水装置,每一处细节都彰显着智能的力量。而远程抄表、空调和变配电的智能化管控,更是在节能降耗的同时,极大地提升了园区的运维效率。更令人兴奋的是,通过智慧监控、人流统计和自动访客系统等高科技手段,园区的安全防范能力得到了质的飞跃,让每一位入驻企业和个人都能享受到“拎包入住”般的便捷与安心。 更令人瞩目的是,智慧园区还构建了集信息服务、企业服务、物业服务于一体的综合服务体系。无论是通过园区门户进行信息查询、投诉反馈,还是享受便捷的电商服务、法律咨询和融资支持,亦或是利用云ERP和云OA系统提升企业的管理水平和运营效率,智慧园区都以其全面、专业、高效的服务,为企业的发展插上了腾飞的翅膀。而这一切的背后,是大数据、云计算、人工智能等前沿技术的深度融合与应用,它们如同智慧的大脑,让园区的管理和服务变得更加聪明、更加贴心。走进智慧园区,就像踏入了一个充满无限可能的未来世界,这里不仅有科技的魅力,更有生活的温度,让人不禁对未来充满了无限的憧憬与期待。

    Matlab实现BO贝叶斯优化-Transformer-GRU多特征分类预测的详细项目实例(含完整的程序,GUI设计和代码详解)

    内容概要:本文档介绍了基于MATLAB实现的贝叶斯优化(BO)、Transformer和GRU相结合的多特征分类预测项目实例,涵盖了详细的程序设计思路和具体代码实现。项目旨在应对数据的多样性与复杂性,提供一种更高效的多特征数据分类解决方案。文档主要内容包括:项目背景与意义,技术难点与解决方案,具体的实施流程如数据处理、模型构建与优化、超参数调优、性能评估以及精美的GUI设计;详细说明了Transformer和GRU在多特征数据分类中的应用及其与贝叶斯优化的有效结合,强调了其理论与实际应用中的价值。 适合人群:具备一定机器学习和MATLAB编程基础的研发人员,特别是从事多维数据处理与预测工作的专业人士和技术爱好者。 使用场景及目标:① 适用于金融、医疗、交通等行业,进行复杂的多维数据处理和预测任务;② 提升现有分类任务中复杂数据处理的准确度和效率,为各行业提供智能预测工具,如金融市场预测、患者病情发展跟踪、交通流量管理等。 其他说明:本文档包含了丰富的实战案例和技术细节,不仅限于模型设计本身,还涉及到数据清洗、模型优化等方面的知识,帮助使用者深入理解每一步骤背后的原理与实现方法。通过完整的代码样例和GUI界面设计指导,读者可以从头到尾跟随文档搭建起一套成熟的分类预测系统。

    Hive sql练习题,只是参考作用

    大数据的sql练习题,初级中级高级

    基于自注意力机制的序列转换模型-Transformer的提出及其应用

    内容概要:论文介绍了名为Transformer的新网络架构,它完全基于自注意力机制,在不使用递归或卷积神经网络的情况下建模输入与输出之间的全局依赖关系,尤其适用于长文本处理。通过多头自注意力层和平行化的全连接前馈网络,使得在机器翻译任务上的表现优于当时最佳模型。具体地,作者用此方法实现了对英语-德语和英语-法语翻译、句法解析等任务的高度并行化计算,并取得显著效果。在实验方面,Transformer在较短训练时间内获得了高质量的翻译结果以及新的单一模型基准。除此之外,研究人员还探索了模型变体的效果及其对于不同参数变化时性能的变化。 适用人群:从事自然语言处理领域的研究者、工程师、学生,熟悉深度学习概念尤其是编码器-解码器模型以及关注模型创新的人士。 使用场景及目标:主要适用于序列到序列(seq2seq)转换任务如机器翻译、语法分析、阅读理解和总结等任务的研究和技术开发;目标在于提高计算效率、缩短训练时间的同时确保模型性能达到或超过现有技术。 其他说明:本文不仅提出了一个新的模型思路,更重要的是展示了自注意力机制相较于传统LSTM或其他方式所拥有的优势,例如更好地捕捉远距离上下文关系的能力

    【故障诊断】一种滚动体轴承或齿轮的重复瞬态提取方法研究 附Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    用于平抑可再生能源功率波动的储能电站建模及评价 附Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    使用 KTH 数据集进行人类行为识别 附Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    【深度学习】基于计算机视觉的自动驾驶应用 附Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

Global site tag (gtag.js) - Google Analytics