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

erlang的消息队列

阅读更多

erlang的消息队列做的很牛逼,erlang的每个进程都有个消息队列,当一个进程接收到消息后,就会存储在该进程的消息队列中,然后如果进程当前执行的代码有receive Partten,则会对当前消息队列中的消息进行匹配,如果匹配成功则这条消息就从消息队列中拿走了,如果该进程继续进行接收,那么会重新对整个消息队列进行匹配,直到找到符合要求的消息,如果所有消息都不符合要求则要么等待要么超时。

所以我们可以通过下面的方法把需要的消息,从消息队列中拿出来,这种方式就是选择性接收:

rec(Result) ->
    receive
        {msg, A} ->
            io:format("~p~m.", [A]),
            rec([{msg, A}|Result])
    after 0 ->
        Result
    end.

 after 0 的作用是当遍历完整个消息队列后,立即返回结果。这种方式有什么实际用途么?

在工作中有这样的问题:例如有很多用户给一个离线的用户发送消息,这些消息都要存储在数据库的离线表中,可是我们知道,数据库的操作是非常消耗时间的,所以我们希望把某个用户的很多离线消息一次写入数据库,而不是一条消息写一次。那么接收离线消息的gen_server就要是这样的了:

handle_info({msg, From, To, Msg}, State) ->
    MsgList = rec(N),
    store_to_db(MsgList),
    {noreply, State};
handle_info(Info, State) ->
    io:format("handle_info:~p~n", [Info]),
    {noreply, State}.


rec(Result) ->
    receive
        {msg, _, To, _} = Msg ->
            rec([Msg|Result])
    after 0 ->
        Result
    end.

 这样当收到一条消息的时候,rec就会查找整个消息队列,然后找到相同接收者的消息,把所有消息一起存储进数据库中,然后gen_server继续handle_info下一个接收者的消息。

1
2
分享到:
评论

相关推荐

    Erlang和RabbitMQ 消息队列

    Erlang和RabbitMQ 消息队列

    pqueue:Erlang优先级队列

    pqueue:Erlang优先级队列

    Rabbit,Erlang,消息队列。

    Linux下Rabbit及Erlang。官网下载比较慢。rabbitmq-server-generic-unix-3.7.15.tar.xz、otp_src_22.0.tar.gz

    erlang-task-queue:Erlang 任务队列行为

    Erlang 任务队列行为模块示例: -module(bruteforce_worker).-behaviour(task_queue).-export([ init/1, process_task/2, terminate/2, code_change/3 ]).-record(state, {}).init(_Args) -> #state{}.process_task...

    rabbitMq+erlang+延时队列插件完整安装包.7z

    rabbitMq+erlang+延时队列插件完整安装包(正确的版本对应)

    RabbitMQ实战 高效部署分布式消息队列

    AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。 AMQP...

    RabbitMq消息队列指南.docx

    RabbitMQ是由erlang语言开发,基于AMQP(Advanced Message Queue 高级消息队列协议)协议实现的消息队列,它是一种应用程序之间的通信方法,消息队列在分布式系统开发中应用非常广泛。 MQ 为Message Queue , 消息...

    RabbitMQ实战 高效部署分布式消息队列完整版带书签

    AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。 AMQP...

    erlang21.3_rabbitmq3.8.3.zip

    由于官网下载速度慢,提供一个最新版消息队列服务器下载 安装方式1、先装erlang.exe(路径因为不要有空格)装好之后配置环境变量path 指向erlang的bin 2、安装rabbitmq然后打开cmd安装插件RabbitMQ-Plugins(网页管理...

    Go语言版本rabbitmq消息队列库:simple、worker、Fanout 模型、Direct 模型、Topic模型

    RabbitMQ 是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常重量级,更适合于企业级的开发。同时实现了一个经纪人(Broker)构架,这意味着消息在发送...

    消息队列+RabbitMQ3.12.10和Erlang安装包

    包含了rabbitMQ3.12.10安装包和Erlang26.0.2安装包(Windows版)。

    RabbitMQ+Erlang+RabbitMq延时队列插件

    RabbitMQ+Erlang+RabbitMq延时队列插件

    rabbitMq和erlang安装包

    rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统。它遵循Mozilla Public License开源协议,采用 Erlang 实现的工业级的消息队列(MQ)服务器,Rabbit MQ 是建立在Erlang OTP平台上。

    消息队列rabbitmq下载地址.rar

    rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统。它遵循Mozilla Public License开源协议,采用 Erlang 实现的工业级的消息队列(MQ)服务器,Rabbit MQ 是建立在Erlang OTP平台上。

    rabbitmq-server-3.7.7和erlang21.0.1.zip

    rabbitmq是实现了高级消息队列协议(AMQP)的开源消息代理软件,RabbitMQ服务器是用Erlang语言编写的,安装rabbitmq需要安装Erlang开发环境,rabbitmq-server-3.7.7和erlang21.0.1

    esl-erlang_23.0_windows_amd64.exe

    这个erlang23.0版本,根据rabbitMQ官网的介绍,可以和下面这几个版本的rabbitMQ配合使用: 3.8.9 3.8.8 3.8.7 3.8.6 3.8.5 3.8.4 其他版本的rabbit,请移步其他资源下载

    Erlang22.3和RabbitMQ3.8.4.zip

    消息队列RabbitMQ必备。RabbitMQ服务器---RabbitMQ3.8.4和其对应的Erlang语言版本---Erlang22.3

    开源 RabbitMQ 消息队列解决方案部署手册

    RabbitMQ 是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ 服务器是用 Erlang 语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理...

    chef-rabbitmq:RabbitMQ 厨师食谱

    用于管理、安装和配置 RabbitMQ(Erlang 消息队列应用程序)的 Chef 手册。 这本食谱特别由rabbitmq_http_api_client gem和amqp gem 提供支持。 因此,它强制管理 API 可用,并且可以完成从队列管理到用户创建和...

    RabbitMQ 和 erlang

    AMQP :Advanced Message Queue,高级消息队列协议。它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制。 RabbitMQ 最初起源于...

Global site tag (gtag.js) - Google Analytics