单例请求缓冲区的 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
实例构造消息。
是否有处理发布端并发的最佳实践? 假设我们有一个客户端想要处理 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
实例构造消息。