在 Aeron 中,日志缓冲区(Log Buffer)是一个内存映射文件,分为四个部分:
- 三个大小相等的部分 — 每个Term都有一个唯一的Term ID — 用于保存报文头和报文数据;
- 元数据部分,位于文件末尾。
每个术语(Term)可以处于三种逻辑状态之一:
clean
术语(term)尚未写入数据(clean
terms have yet to have data written to them)active
术语(term)是指正在写入数据的地方(anactive
term is where data is being written to,)- 和
dirty
(脏数据)项所包含的数据已不再有效,但暂时可用于重新传输。
在典型运行过程中,术语(term)从clean
到active
再到dirty
的循环。当每个术语(term)完成一个循环时,Term IDs 会递增。当向publication
提供信息时,会创建一个 Aeron header,并将header和信息数据写入日志缓冲区(log buffer)的一个术语(term)中。向订阅(subscription)提供数据时,有时您会收到显示admin action
操作的响应。当 Aeron 忙于轮换术语(term)时,就会发生admin action
操作。
每个publication
都会收到自己的日志缓冲区。images是订阅(subscription)复制发布(publication)流。您很少需要直接与images对象交互,最常用的是通过 Aeron 群集快照加载过程。
一、重建流(Reconstructing a stream)
UDP 报文可能而且经常会不按顺序到达。Aeron 可确保信息流中的信息顺序得以保留。日志缓冲区通过使用每条报文中的报文头数据,将数据正确放置在日志缓冲区中,从而帮助正确重建有序的报文流。
收到信息后,它们会被放置在日志缓冲区的正确位置。高水位(rcv-hwm
)可追踪日志缓冲区中接收到数据的最远点,而完成位置(rcv-pos
)则标志着已接收到连续序列的最高点。这两个值在 AeronStat
工具中均可见 - 请参阅 Aeron Tooling。
只有在完成位置向前移动后,订阅(subscription)才会收到新的片段。以上面的动画为例,在收到顶部信息后,订阅(subscription)会收到有片段可用的通知。只有在底部信息写入日志缓冲区后,订阅(subscription)才会收到下一个片段。
二、Term Buffer Lengths
术语缓冲区(Term buffer)长度是通过系统属性 aeron.term.buffer.length
或 aeron.ipc.term.buffer.length
设置的。也可以使用 publicationTermBufferLength
和 ipcTermBufferLength
在 Media Driver context 中进行设置。
- 最小的术语缓冲区(term buffer)长度为 65536 字节;
- 最大的术语缓冲区(term buffer)长度为 1,073,741,824 字节;
- 大小必须是 2 的幂;
- 最大报文长度为 16 兆字节或术语缓冲区长度 / 8 的最小值;
- 如果需要,可以设置单个publication的术语缓冲区(term buffer)长度。请参阅How to send messages over 8kb
- 如果应用程序将在
/dev/shm
目录中托管日志缓冲区(log buffer),则需要确保有足够的空间。
三、Unblocking
当客户端或发布失败导致日志缓冲区(Log Buffer)被阻塞时,Aeron会执行解阻塞操作。当publication
被关闭且仍有请求时,或者当客户端意外断开连接时,Aeron将在后台解除阻塞。为了让日志缓冲区(Log Buffer)继续运行,Aeron 将重置头,并在达到解锁超时(默认为 15 秒)后解除对日志缓冲区(Log Buffer)的阻塞。
注:
您可以使用 Aeron Stat
工具观察publication和控制命令解锁事件的数量。请参阅 Aeron Tooling,特别是 Unblocked Publications
和 Unblocked Control Commands
。