Какова надежная схема для выпуска общего Bytebuf, написанного по нескольким каналам, особенно с ошеломленными записями иJAVA

Программисты JAVA общаются здесь
Anonymous
Какова надежная схема для выпуска общего Bytebuf, написанного по нескольким каналам, особенно с ошеломленными записями и

Сообщение Anonymous »

Я пытаюсь внедрить высокопроизводительный сервис фаната (вещания) в Нетти, где мне нужно написать один и тот же, неизменный байтбуф на несколько каналов. Чтобы избежать копий памяти, я использую stavedDuplicate (). < /P>
Задача заключается в обработке жизненного цикла общего буфера, особенно когда операции записи могут сбой.for (Channel channel : allChannels) {
final ByteBuf duplicate = masterBuffer.retainedDuplicate();
channel.writeAndFlush(duplicate).addListener(future -> {
if (!future.isSuccess()) {
// Problem: What if another handler in the pipeline already released it?
if (duplicate.refCnt() > 0) { // Unsafe check
duplicate.release();
}
channel.close();
}
});
}
masterBuffer.release();
< /code>
Я быстро обнаружил несколько критических проблем с этим: < /p>

Shared refcnt: retainedDuplicate () создает представление о общей памяти, и все дубликаты имеют один и тот же базовый счет. Общий refcnt. Если запись другого канала не удается, его слушатель может увидеть призыв, который все еще> 0 и попытаться выпустить его снова, но третий канал все еще может активно использовать память, что приводит к нелегальнореференско -саунтексации или повреждению данных. Простая проверка if (refcnt> 0) не безопасна. Записи со временем поражены; Я мог бы отправить буфер на 100 каналов сейчас, а затем еще 50 каналов через несколько секунд, все как часть одной и той же логической операции.>

Подробнее здесь: https://stackoverflow.com/questions/797 ... ultiple-ch

Вернуться в «JAVA»