tinymq学习小结
学了tinymq,
先将它的README翻译了一下:
TinyMQ - A diminutive message queue (TinyMQ ---一个小型的消息队列)
TinyMQ是一个为erlang实现的基于频道的内存消息队列。频道被字符串标识(任何你想的字符串),同时根据需要自动创建和销毁。每一个频道都被一个gen_server进程管理。理论上,每一个频道进程属于一个erlang集群的不同节点,但是现在的代码中,他们都属于TinyMQ启动的那个进程节点。
启动队列:application:start(tinymq), % the max_age 环境变量定义了消息的默认超时时间,单位秒,默认值为60。
推送消息到一个频道:tinymq:push("some-channel", <<"Hello, world!">>),
检查某个频道是否存在消息:
Timestamp = tinymq:now("some-channel"), %获取时间戳,新消息要大于这个值
{ok, NewTimestamp, Messages} = tinymq:poll("some-channel", Timestamp), %获取消息和新时间戳
时间戳是个很重要的API设计,通过使用返回的时间戳NewTimeStamp,你能够确保收到管道的所有消息,并且没有重复。
此外,轮询一个频道可以为进程订阅某个频道,一旦消息到达,能够收到任何发送给此频道的消息。
tinymq:subscribe("some-channel", now, self()),
%now是个原子或者是个时间戳,self()表示收到消息的那个进程
receive
{_From, Timestamp, Messages} ->
io:format("Received messages: ~p~n", [Messages])
end
每个频道都有不限制的订阅者。一旦第一条消息被发送,订阅者就会从频道中移除,因此,为了保持订阅者活跃有效,你需要通过返回的时间戳作为下一次调用的输入来重新订阅。
本质上,消息存储在一个优先级队列中,任何频道活跃之后都会清空旧的消息(但是不超过每秒一次),
开销是O(log(M) + E),M是在一个频道中的消息总数,E是一个频道中,自从上一次消息到期时间到现在的消息数目。用更好的数据结构,可能会提升到O(log(M)),但需要注意,垃圾回收器将不得不执行O(E)的操作。因此额外的开销可能不值得我们为此失眠。
在最大默认超时时间之后一直没有活动频道将被销毁,因为旧消息只有当频道活跃的时候才会被销毁,一些消息存在内存中超过2*max_age秒数(比如最后一个频道活跃发生时\epsilon秒之前,消息被设置成到期)。
一个频道的新消息被连续地发送到所有频道的订阅者中,通过适当的并行运行,时间可能提升到O(S/K),S是订阅者的数量,K是内核数量。但是这需要做些工作。
tinymq学习小结的更多相关文章
- flex学习小结
接触到flex一个多月了,今天做一个学习小结.如果有知识错误或者意见不同的地方.欢迎交流指教. 画外音:先说一下,我是怎么接触到flex布局的.对于正在学习的童鞋们,我建议大家没事可以逛逛网站,看看人 ...
- Python 学习小结
python 学习小结 python 简明教程 1.python 文件 #!/etc/bin/python #coding=utf-8 2.main()函数 if __name__ == '__mai ...
- react学习小结(生命周期- 实例化时期 - 存在期- 销毁时期)
react学习小结 本文是我学习react的阶段性小结,如果看官你是react资深玩家,那么还请就此打住移步他处,如果你想给一些建议和指导,那么还请轻拍~ 目前团队内对react的使用非常普遍,之 ...
- objective-c基础教程——学习小结
objective-c基础教程——学习小结 提纲: 简介 与C语言相比要注意的地方 objective-c高级特性 开发工具介绍(cocoa 工具包的功能,框架,源文件组织:XCode使用介绍) ...
- pthread多线程编程的学习小结
pthread多线程编程的学习小结 pthread 同步3种方法: 1 mutex 2 条件变量 3 读写锁:支持多个线程同时读,或者一个线程写 程序员必上的开发者服务平台 —— DevSt ...
- ExtJs学习笔记之学习小结LoginDemo
ExtJs学习小结LoginDemo 1.示例:(登录界面) <!DOCTYPE html> <html> <head> <meta charset=&quo ...
- 点滴的积累---J2SE学习小结
点滴的积累---J2SE学习小结 什么是J2SE J2SE就是Java2的标准版,主要用于桌面应用软件的编程:包括那些构成Java语言核心的类.比方:数据库连接.接口定义.输入/输出.网络编程. 学习 ...
- (转) Parameter estimation for text analysis 暨LDA学习小结
Reading Note : Parameter estimation for text analysis 暨LDA学习小结 原文:http://www.xperseverance.net/blogs ...
- dubbo学习小结
dubbo学习小结 参考: https://blog.csdn.net/paul_wei2008/article/details/19355681 https://blog.csdn.net/liwe ...
随机推荐
- springboot配置文件之yml的语法学习
springboot配置文件(.yml/.yaml.properties) YAML(YAML Ain't Markup Language) YAML A Markup Language:是一个标记语 ...
- React前端有钱途吗?《React+Redux前端开发实战》学起来
再不学React就真的跟不上大前端的形式了,目前几乎所有前端的招聘条件都是精通React者优先,看看拉勾网的React薪资,都是15K-20K,这个暑假,必须动起来了. 如果你熟悉JavaScript ...
- Python多线程异步任务队列
原文地址 python的多线程异步常用到queue和threading模块 #!/usr/bin/env python # -*- coding: UTF-8 -*- import logging i ...
- css3中单位rem与.less结合布局
rem是CSS3新增的一个相对单位(root em,根em),这个单位引起了广泛关注.这个单位与em有什么区别呢?区别在于使用rem为元素设定字体大小时,仍然是相对大小,但相对的只是HTML根元素. ...
- linux版宝塔安装Redis
1安装服务 2配置设置 3安装PHP扩展 首先,我们来安装服务,进入管理面板--软件管理--运行环境--redis-点击安装,等待完成 完成之后开始第二步,配置设置.这一步根据自己需要进行配置.注意安 ...
- opengl学习-利用模板测试勾画物体轮廓中出现的一个问题
我在学习OpenGL模板测试勾画物体轮廓的时候,出现了这个问题: 这个出现的原因就是,改变摄像机的时候,每次绘制,上次绘制中模板缓冲区的数据没有清除的原因.也就是在while循环开始的时候,glCle ...
- 阿里云(ecs服务器)使用1-设置安全组
1.进入阿里云的控制台https://ecs.console.aliyun.com/?#/server/region/cn-qingdao,点击管理 2.点击左边的 本实例安全组 3. 点击加入配置规 ...
- PHP5.3x被弃用的函数及代替方法
今天阳光明媚,万里无云,小记一下php5.3x被弃用的部分函数及代替方法 下面列举了部分被弃用的函数:call_user_method():(使用 call_user_func() 替代)call_u ...
- 微擎后台进行GET提交
微擎form表单进行GET提交时,要传递 name 分别为 c , a , m , do 的值 例如: <form action="{php echo $this->create ...
- mysql向redis导入数据
数据库结构如下 如果是linux系统下,如此整备数据 SELECT CONCAT( "*10\r\n", '$', LENGTH(redis_cmd), '\r\n',redis_ ...