Erlang并发机制 – 消息传递
Erlang系统中,进程之间的通信是通过消息传递来完成的。消息使用Pid ! Message的形式发送,通过receive语句获取。每个Erlang进程都有用来存储传入消息的信箱。当一个消息发送的时候,它会从发送进程中拷贝到接收进程的信箱,并以它们到达的时间次序存储。消息的传递是异步的,一个发送进程不会在发送消息后被暂停。...
View ArticleErlang并发机制 – 垃圾回收
Erlang中每个进程都有独立的堆内存,默认的大小是233个words(可配置),并以Fibonacci序列的顺序增长(233对应fib(11))。不过,当堆内存增大到一定程序时,增长速度减缓,比如内存大于fib(35)=14M的时候,堆内存开始不以Fibonacci序列增长(具体参见[$R15B_OTP_SRC/erts/emulator/beam/erl_gc.c -->...
View ArticleErlang热部署 – 模块更新
Erlang的热部署做的很完善,参见Release Handling,这篇文章只关心最基本的模块更新。模块是Erlang程序组织的最基本单元。如下代码就是一个最简单的hello模块(为了说明问题,我们添加了一个init函数): -module(hello). -export([init/0, hello/1]). init() -> Db = dict:new(),...
View ArticleRabbitMQ源码分析 - 启动
RabbitMQ是一个消息队列的实现,基于AMQP(Advanced Message Queuing Protocol)。最近因为工作需要,打算深入了解RabbitMQ的架构以实现,后续会出一系列文章记录分析过程。这篇总结RabbitMQ的启动过程。 (注:分析代码基于RabbitMQ 2.8.2)...
View ArticleRabbitMQ源码分析 – 网络层
(注:分析代码基于RabbitMQ 2.8.2) 网络层的启动也是作为上一篇文章中提到的一个启动步骤来启动的,入口为[$RABBIT_SRC/src/rabbit_networking.erl --> boot/0],代码如下: boot() -> ok = start(), ok = boot_tcp(), ok = boot_ssl()....
View ArticleRabbitMQ源码分析 – 实体初始化
(注:分析代码基于RabbitMQ 2.8.2) Connection 在上篇文章中提到,客户端连上rabbit后,需要向rabbit发送AMQP协议头,rabbit在收到协议头后,开始在0号channel 上跟客户端进行交互(AMQP中一个连接可以多路复用,1~65535为可用的channel编号,0号channel,也就是frame中channel的索引为0,被认为是全局于整个连接)。...
View ArticleRabbitMQ源码分析 – 消息生命周期
(注:分析代码基于RabbitMQ 2.8.2) 当客户端通过basic.publish命令(AMQP定义)发布一个消息时,rabbit需要经过以下几个步骤处理消息: 1) 根据客户端传来的消息内容及相关属性(目标exchange,routing keys,mandatory及immediate属性)构造一个消息实体; 2) 根据要投递的exchange及routing...
View ArticleRabbitMQ源码分析 - 队列机制
(注:分析代码基于RabbitMQ 2.8.2) 当rabbit无法直接将消息投递到消费者时,需要暂时将消息入队列,以便重新投递。但是,将消息入队列并不意味着,就是将消息扔在一个队列中就不管了,rabbit提供了一套状态转换的机制来管理消息。 在rabbit中,队列中的消息可能会处理以下四种状态: alpha:消息内容以及消息在队列中的位置(消息索引)都保存在内存中;...
View ArticleI/O模型:阻塞、非阻塞 &同步、异步
这篇文章主要总结下这几个概念,前几天看到微博里在讨论,当时也有点搞不清楚,昨天在看到Reactor和Proactor模式的时候,又提到相关概念,索性搞搞清楚,写个总结。 《Unix网络编程卷1:套接字联网API》(下面称为卷1)第6章对Unix I/O模型有5种划分:阻塞式I/O模型,非阻塞式I/O模型,I/O复用模型,信号驱动式I/O,异步I/O模型。这里我们只关心跟我们主题相关的四类:...
View Article