单例请求缓冲区的 Aeron 发布端并发问题

Aeron publication side concurrency issue on singleton request buffer

是否有处理发布端并发的最佳实践? 假设我们有一个客户端想要处理 100 万个并发请求,这些请求必须通过 publication offer 发送到 Aeron 服务器端。现在我们有一个单例可扩展数组缓冲区,它会覆盖并被并发损坏。

从问题的描述来看,你应该受益于使用https://github.com/real-logic/agrona/blob/master/agrona/src/main/java/org/agrona/concurrent/ringbuffer/ManyToOneRingBuffer.java,然后实现使用io.aeron.ExclusivePublication#offer的MessageHandler。

这取决于 Publication 的创建方式,即 io.aeron.Aeron#addPublication returns ConcurrentPublication class 的实例,顾名思义可以被多个线程同时使用。另一方面,io.aeron.Aeron#addExclusivePublication returns 一个 ExclusivePublication 实例,只能由单个线程使用。

@mohamadreza:为什么要使用单个共享的可扩展数组缓冲区?

我假设您使用的是并发 Publication 而这不是并发访问的问题。这个问题似乎是要约的共享缓冲区。要同时发布,您可以使用线程本地缓冲区在其中构造消息,或者如果消息长度小于 MTU,则可以使用 Publication.tryClaim 并使用线程本地 BufferClaim 实例构造消息。