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下一个接收者的消息。
相关推荐
在IT行业中,消息队列(Message Queue)是一种重要的中间件技术,它主要用于解耦系统组件,提高系统的可扩展性和容错性。RabbitMQ作为一款流行的消息队列服务器,广泛应用于分布式系统中。Erlang则是一种并发并行...
**Erlang与RabbitMQ消息队列详解** 在分布式系统设计中,消息队列扮演着至关重要的角色,它能够实现系统间的异步通信、负载均衡以及解耦合。Erlang是一种为并发和分布式计算设计的编程语言,而RabbitMQ是一个基于...
综上所述,通过下载并安装提供的Erlang和RabbitMQ安装包,你可以构建一个稳定的消息队列系统,利用其优势来优化你的应用程序设计,实现高效、可靠的异步通信。同时,理解Erlang OTP和AMQP协议对于更好地利用RabbitMQ...
RabbitMQ是基于Erlang语言开发的高性能消息队列,支持AMQP协议,强调高可用性和可靠性,广泛用于高并发场景。 RocketMQ则是阿里巴巴开源的消息中间件,以高吞吐量、低延迟和强大的分布式能力著称,可以处理万亿级别...
RabbitMQ,一个流行的消息队列服务器,就是用Erlang编写的。这个可能是RabbitMQ依赖的Erlang运行环境的安装程序,适用于64位Windows系统。 3. **rabbitmq-server-3.12.8.exe**:这是RabbitMQ服务器的安装程序,版本...
消息队列是一种重要的分布式系统组件,它在不同的进程或服务之间提供异步通信,通过缓存消息来解耦系统,提高系统的可扩展性和可靠性。在本教程中,我们将详细讲解如何在您的系统上安装RabbitMQ,这是一款广泛使用的...
**Erlang 优先级队列(Pqueue)** 在 Erlang 编程语言中,优先级队列(Priority Queue)是一种数据结构,它允许我们按照优先级对元素进行排序和处理。这种数据结构在很多场景下都非常有用,比如调度任务、事件驱动...
- **RabbitMQ**:基于Erlang语言,稳定性高,广泛应用于多个平台,支持多种消息协议,适用于大型分布式系统。 - **Kafka**:由LinkedIn开发,后来成为Apache项目,擅长处理高吞吐量的实时数据流,适合大数据和实时...
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是一款开源的消息队列系统,它基于AMQP(Advanced Message Queuing Protocol)协议,由Erlang语言开发,提供了高可用性、可靠性和可扩展性。Erlang是一种并发编程语言,以其在分布式系统中的高效性能和容错...
RabbitMQ由Erlang语言编写,它的核心功能是接收和转发消息。生产者是发送消息的实体,而消费者是接收消息的实体。消息在RabbitMQ中通过交换机(Exchanges)进行路由,交换机根据预设的规则(Binding)将消息分发到...
【RabbitMQ】是一种基于Erlang语言开发的消息中间件,它主要用于实时、高可靠性的消息传递。RabbitMQ的工作模式类似于WebSocket,但更倾向于服务器之间的通信,而非客户端与服务器的交互。它作为服务器间的“中转站...
**RabbitMQ实战:高效部署分布式消息队列** 在当今的互联网应用开发中,分布式系统已经成为常态,而消息队列(Message Queue)作为其中的关键组件,对于系统的解耦、异步处理以及容错能力的提升起到了重要作用。...
AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。 AMQP...
《RabbitMQ实战:高效部署分布式消息队列》是一本深度探讨RabbitMQ技术的书籍,旨在帮助读者理解和掌握如何在分布式环境中高效地部署和使用RabbitMQ消息队列。RabbitMQ作为一款广泛使用的开源消息中间件,是实现应用...
RabbitMQ,一个基于Erlang开发的消息队列系统,是实现异步通信的关键组件。 标题中提到的“Erlang官网下载过慢”可能是因为网络问题或者官方服务器的繁忙导致的,这对于急需安装或更新Erlang的开发者来说是一个常见...
2. RabbitMQ:基于Erlang开发,广泛应用于多种语言环境,支持多种消息协议。 3. Kafka:由LinkedIn开源,主要用于实时流处理,具有高吞吐量和低延迟特性。 4. RocketMQ:阿里巴巴开源,主要用于大规模分布式系统,...
在实际使用中,RabbitMQ的Java实现使用轻量级的订阅-发布模型,它由Erlang语言开发,提供了对多种消息协议的支持,包括AMQP、XMPP、OpenWire、STOMP、REST、WSNotification等。RabbitMQ的特性包括支持事务持久化消息...
### 各种消息队列技术对比分享 #### 一、消息队列概念解析 消息队列作为一种关键的中间件技术,在分布式系统中扮演着至关重要的角色。它通过提供一种高效、可靠的异步通信机制,帮助解决系统之间的解耦、负载均衡...
RabbitMQ 是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常重量级,更适合于企业级的开发。同时实现了一个经纪人(Broker)构架,这意味着消息在发送...