3

これはばかげた質問かもしれませんが、OneToOneRingBuffer と ManyToOneRingBuffer が aeron (agrona) で利用可能です。単一のプロデューサーと多くのコンシューマーがあり、OneToManyRingBuffer と同等の効果を得るにはどうすればよいでしょうか?

4

1 に答える 1

2

BroadcastTransmitterAgrona では、BroadcastReceiver1 対多のセマンティクスを提供する 1 つのアプローチです。

遅いコンシューマーは、メッセージがドロップされる可能性があることに注意してください。これが望ましくない場合は、このシナリオでパブリッシャーに背圧をかける可能性のある Aeron IPC を検討することもできます。

トップレベル、これを使用する方法は次のとおりです。

// Create broadcast buffer
int capacity = 1 << 10; // Must be power of two
int bufferSize = capacity + BroadcastBufferDescriptor.TRAILER_LENGTH;
UnsafeBuffer broadcastBuffer = new UnsafeBuffer(new byte[bufferSize]);

// Create transmitter
BroadcastTransmitter transmitter = new BroadcastTransmitter(broadcastBuffer);

// Create receiver (can create many of these)
BroadcastReceiver broadcastReceiver = new BroadcastReceiver(broadcastBuffer);
CopyBroadcastReceiver copyBroadcastReceiver = new CopyBroadcastReceiver(broadcastReceiver);

// Send message
int msgTypeId = 1;
MutableDirectBuffer msgBuffer = new ExpandableArrayBuffer();
int msgLength = msgBuffer.putStringWithoutLengthAscii(0, "Hello World!");
transmitter.transmit(msgTypeId, msgBuffer, 0, msgLength);

// Receive message
copyBroadcastReceiver.receive(
  (msgType, buffer, offset, length) -> System.out.println(buffer.getStringWithoutLengthAscii(offset, length)));
于 2020-06-14T21:00:00.560 に答える