На стороне клиента я кэширую ManagedChannel в ConcurrentHashMap для каждой службы, поскольку хочу повторно использовать один и тот же канал.Я столкнулся с двумя проблемами:
а) Когда сервер Grpc перезапускается или сервер Grpc перемещается на другой хост, у меня нет возможности узнать, когда канал закрыт и т. д.
При попытке нижеприведенных подходов :
Код: Выделить всё
private final ConcurrentMap channels;
ManagedChannelBuilder managedChannelBuilder = ManagedChannelBuilder
.forTarget(target)
.usePlaintext();
final ManagedChannel channel = managedChannelBuilder
.build();
monitorChannelState(channel, service);
private void monitorChannelState(ManagedChannel channel, String service) {
channel.notifyWhenStateChanged(ConnectivityState.TRANSIENT_FAILURE, () -> {
logger.warn("Channel is in TRANSIENT_FAILURE state for [service={}]. Attempting to reconnect...", service);
close(service);
create(service);
});
channel.notifyWhenStateChanged(ConnectivityState.IDLE, () -> {
logger.info("Channel is in IDLE state for [service={}]. Requesting connection...", service);
channel.getState(true); // Request connection
});
}
void close(final String service) {
if (StringUtils.isNotBlank(service)) {
ManagedChannel removedChannel = channels.remove(service);
if (removedChannel != null) {
logger.info("Closing down Channel [service={}]", service);
removedChannel.shutdownNow();
}
}
}
При мониторинге канала.notifyWhenStateChanged(ConnectivityState.SHUTDOWN) он пытается воссоздать канал для каждого вызова, что не является оптимизированным решением.Сценарий 2:
При мониторинге канала.notifyWhenStateChanged(ConnectivityState.TRANSIENT_FAILURE) он попадает в цикл подключения. Даже при добавлении стратегий экспоненциального повторного подключения это тот же цикл.
Мой вопрос: как воссоздать канал при перезапуске сервера Grpc или перемещении на другой компьютер
Подробнее здесь: https://stackoverflow.com/questions/791 ... os-in-java