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 ...
随机推荐
- Webpack loaderUtils.parseQuery()
https://blog.256pages.com/webpack-loaderutils-parsequery/
- 第二十三篇 jQuery 学习5 添加元素
jQuery 学习5 添加元素 同学们,这节课,使用jQuery动态添加元素,是很关键的一课,一般用在什么地方呢:别人发表一篇文章,你评论楼主的时候,总不能是提交表单,到后台的其他页面处理,然后再 ...
- Python爬虫之简单爬虫框架实现
简单爬虫框架实现 目录 框架流程 调度器url管理器 网页下载器 网页解析器 数据处理器 具体演示效果 框架流程 调度器 #导入模块 import Url_Manager import parser_ ...
- pip 报错找不到pip问题
具体报错如下 解决办法: wget https://bootstrap.pypa.io/get-pip.py --no-check-certificate 使用当前python3运行
- angular.js,IE7,8,9兼容性的处理
转........... 这段时间详细了解了谷歌新出的MVVM框架angular.js,并直接在本人所从事的项目中使用了.但是使用新东西都是有风险的,这不,采用了新框架的页面IE7,8各种显示不出来… ...
- VMware虚拟化集群的配置(一)
一.VMware介绍 VMware vSphere 是业界领先且最可靠的虚拟化平台.vSphere将应用程序和操作系统从底层硬件分离出来,从而简化了 IT操作. VMware集群最主要的两个部分ESX ...
- 20199319《Linux内核原理与分析》第十一周作业
ShellShock攻击实验 什么是ShellShock Shellshock,又称Bashdoor,是在Unix中广泛使用的Bash shell中的一个安全漏洞,首次于2014年9月24日公开.许多 ...
- PAT Basic 1040 有几个PAT (25 分)
字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位(P),第 4 位(A),第 6 位(T):第二个 PAT 是第 3 位(P),第 4 位(A),第 6 位(T). 现 ...
- nvidia-docker安装
如果之前安装过docker1.0版本,需要先删掉该版本和之前创建的容器 docker volume ls -q -f driver=nvidia-docker | xargs -r -I{} -n1 ...
- 08ServletContext
1. 概念 代表整个web应用,可以和程序的容器(服务器)来通信 2. 获取 1. 通过request对象获取 request.getServletContext();2. 通过HttpServlet ...