Открывать и закрывать канал в клиенте gRP C при каждом запросе - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть клиент gRP C в приложении kafka. Это означает, что клиент будет постоянно открывать и закрывать каналы.

public class UserAgentClient {

    protected final Logger logger = LoggerFactory.getLogger(getClass());
    private static final Config uaparserConfig = ConfigFactory.load().getConfig(ua);
    private final ManagedChannel channel;
    private final UserAgentServiceGrpc.UserAgentServiceBlockingStub userAgentBlockingStub;

    public UserAgentParserClient() {
        this(ManagedChannelBuilder.forAddress(uaConfig.getString("host"), uaConfig.getInt("port")).usePlaintext());
    }

    public UserAgentClient(ManagedChannelBuilder<?> usePlaintext) {
        channel = usePlaintext.build();
        userAgentBlockingStub = UserAgentServiceGrpc.newBlockingStub(channel);
    }

    public UserAgentParseResponse getUserAgent(String userAgent ) {
        UserAgentRequest request = UserAgentRequest.newBuilder().setUserAgent(userAgent).build();
        UserAgentParseResponse response = null;
        try {
            response = userAgentBlockingStub.parseUserAgent(request);
        } catch(Exception e) {
            logger.warn("An exception has occurred during gRPC call to the user agent.", e.getMessage());
        }
        shutdown();
        return response;
    }

    public void shutdown() {
        try {
            channel.shutdown();
        } catch (InterruptedException ie) {
            logger.warn("Interrupted exception during gRPC channel close", ie);
        }
    }
}

Мне было интересно, могу ли я держать канал открытым все время? Или мне нужно открывать канал каждый раз, когда я делаю новый звонок? Мне было интересно, потому что я тестировал производительность, и, кажется, она резко улучшится, если я просто оставлю канал открытым. С другой стороны, есть ли что-то, что мне не хватает?

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

Так как открытие и закрытие канала дорого, я полностью удалил channel = usePlaintext.build(); из своего клиента. Вместо этого я открываю и закрываю его в моей кафке Transformer. В моем классе UserAgentDataEnricher, который реализует Transformer.

public class UserAgentDataEnricher implements Transformer<byte[], EnrichedData, KeyValue<byte[], EnrichedData>> {

    private UserAgentParserClient userAgentParserClient;

    @Override
    public void init(ProcessorContext context) {
        this.context = context;
        open();
        // schedule a punctuate() method every 15 minutes
        this.context.schedule(900000, PunctuationType.WALL_CLOCK_TIME, (timestamp) -> {
            close();
            open();
            logger.info("Re-opening of user agent channel is initialized");
        });
    }

    @Override
    public void close() {
        userAgentParserClient.shutdown();
    }

    private void open() {
        channel = ManagedChannelBuilder.forAddress("localhost", 50051).usePlaintext().build();
        userAgentClient = new UserAgentClient(channel);
    }

    ...
}

, и теперь я инициализирую своего клиента так:

public UserAgentClient(ManagedChannel channel) {
    this.channel = channel;
    userAgentBlockingStub = UserAgentServiceGrpc.newBlockingStub(channel);
}
0 голосов
/ 06 февраля 2020

создание нового канала имеет огромные накладные расходы, вы должны держать канал открытым как можно дольше.

...