Я рассматриваю два подхода для отправки сообщений определенного типа по сети.Путь производительности Java против блокировки
1) Существует LoadBalancer с внутренним кешем, который имеет ссылку на каналы. Каждый канал имеет внутренний поток (вызываемый), который имеет реализацию для отправки сообщений и открытого интерфейса, на котором он принимает запросы sendMessage.
Канал предлагает метод LoadBalancer, на котором он может выполнять неблокирующую погоду запроса, он доступен для отправки другого сообщения.
Подводя итог: существует одна нить для LoadBalancer, которая непрерывно объединяет список каналов с чем-то вдоль линий isChannelReady() и отправляет другое сообщение, когда канал готов.
public class SomeLoadBalancingStrategy implements LoadBalancer {
private List<Channel> channels = ChannelFactory.getChannels(//parameters here)
// read from some queue
while(there are messages) {
foreach (channel) {
// non blocking query
if(channel.isReady()) {
channel.sendMessage(message)
}
}
}
2) Каждый объект канала представляет собой исполняемую нить, которая обертывает внутреннюю вызываемую ответственность за отправку сообщений. Каналы блокируются в некоторой параллельной очереди, ожидающей появления новых сообщений. Когда сообщение добавляется в очередь, канал runnable выбирает его и переходит к вызываемому. Этот runnable заблокирован в ожидании результата. Как только результат вызываемого доступен, обертка потока будет отображать следующее сообщение из очереди, возможно, через интерфейс LoadBalancer.
Итак, суммируем: есть два потока на канал, один из которых является вызываемым и отправляет сообщение, а второй ждет этого результата, чтобы он мог получить следующий запрос. В этом случае нет отдельных сообщений диспетчеризации потока LoadBalancer для каналов.
Некоторые примечания:
каналы используют синхронную связь с конечной точкой
Пожалуйста, обратите внимание мое объяснение решений только в качестве шаблона для базовых идей, которые я хотел бы обсудить
Там будет небольшое количество каналов, 5 не более
Будет ли второй подход всегда лучше работать? Существуют ли условия, при которых первый вариант был бы лучше? Аппаратное обеспечение, ОС, что-нибудь? Если каналы были асинхронными, изменилось бы это?
Да, думая об этом, нет необходимости иметь два потока на канал во втором варианте. Мне нравится ваше предложение блокировки очереди каналов, к которым подключаются каналы. Это также очень удобно, если один из каналов временно отключается. Спасибо за ваш ответ. – John
Предполагая, что я использую блокирующую очередь каналов, как бы я вырвался из блокировки в такой очереди, если бы я хотел это сделать? Позволяет сказать, что я хочу делать это каждый раз так часто :) Я предполагаю добавить (и прочитать) какой-то специальный элемент, который указывает, что больше нет сообщений? – John
@ user3360241 Не уверен, что вы имеете в виду. Я думаю, вы говорите о варианте 1. Почему бы вам не заблокировать балансировку нагрузки, если каналов больше нет (и пока некоторые не станут доступны)? Можете быть более конкретными? В противном случае это звучит так, будто вы возвращаетесь к интенсивному опросу ЦП, постоянно спрашивая, пока очередь готовых каналов не пуста, и я думаю, что это бесполезно, если не пустая трата циклов процессора. –