Могу ли я публиковать / использовать в / из нескольких пространств имен и topi c из Apache Pulsar, используя один клиент pulsar? - PullRequest
3 голосов
/ 29 января 2020

Я пытаюсь написать мультитенантную (множественные пространства имен) систему, используя Apache Pulsar. То, чего я не могу достичь, - это публикация в нескольких пространствах имен и разделах в этих пространствах имен с использованием одного клиента / соединения. И то же самое касается и потребителя. По сути, я хочу использовать один экземпляр приложения, чтобы иметь возможность публиковать sh в нескольких пространствах имен и темах, и приложение-потребитель, чтобы иметь возможность делать это во время потребления. Я просто хочу понять, возможно ли это вообще.

Я не хочу поддерживать M * N соединений для M Пространства имен и N тем для каждого пространства имен. Я вижу, что в pulsar есть поддержка регулярных выражений, но что это означает для потребителя, если я хочу использовать каждую топи c отдельно (я получаю смешанные сообщения из всех тем, соответствующих регулярному выражению?)

1 Ответ

3 голосов
/ 30 января 2020

Вы можете опубликовать sh в нескольких темах в одном клиенте, используя несколько производителей в клиенте. Тем не менее, существует взаимно-однозначная связь между продюсером и топи c. Из документации бинарного протокола Pulsar , Pulsar сначала устанавливает связь между производителем и одним топи c (в определенном пространстве арендатора / имени):

message CommandProducer {
  "topic" : "persistent://my-property/my-cluster/my-namespace/my-topic",
  "producer_id" : 1,
  "request_id" : 1
}

И когда он отправляет сообщения, он ссылается на идентификатор производителя:

message CommandSend {
  "producer_id" : 1,
  "sequence_id" : 0,
  "num_messages" : 1
}

Из-за этой связи между производителем и топи c, поэтому для отправки в несколько тем необходимо несколько производителей.

Эта диаграмма иллюстрирует настройку производителя и отправку сообщения: enter image description here

Вот код Java, который иллюстрирует нескольких производителей в клиенте для отправки несколько тем:

       // Create client object
        PulsarClient client = PulsarClient.builder()
                .serviceUrl("pulsar+ssl://useast2.aws.kafkaesque.io:6651")
                .authentication(
                    AuthenticationFactory.token("eyJhbGciOiJS...")
                )
                .build();

        // Create producer on a topic
        Producer<byte[]> producer1 = client.newProducer()
                .topic("persistent://tenant/local-useast2-aws/test-topic4")
                .create();

        // Create another producer on a different namespace/topic
        Producer<byte[]> producer2 = client.newProducer()
                .topic("persistent://tenant/namespace2/test-topic5")
                .create();

        // Send messages on the producers
        producer1.newMessage().value("ping from producer1".getBytes()).send();
        producer2.send("ping".getBytes());

        // Send close the producers
        producer1.close();
        producer2.close();

Что касается потребителя, то, как и производитель, вы можете использовать несколько клиентов в клиенте, чтобы использовать несколько тем. Или вы можете использовать регулярные выражения, чтобы связать одного потребителя с несколькими темами. Но да, вы будете получать сообщения от всех тем, соответствующих регулярному выражению, для этого одного потребителя. Кстати, вы можете прочитать отличный анализ использования регулярных выражений для подписки на несколько тем Джеком Ванлайтли здесь .

...