Понимание того, как Akka обеспечивает противодавление

#solr #cassandra #akka #akka-stream #reactive

#solr #кассандра #akka #akka-поток #реактивный

Вопрос:

Итак, у нас есть вариант использования в наших производственных системах, где мы, вероятно, могли бы использовать потоки Akka. Чтобы понять, как именно потоки Akka обеспечивают противодавление, я хотел бы немного углубиться в наши требования.

У нас есть кластер Solr, в котором хранятся некоторые из наших данных. Далее, у нас есть игровое приложение, которое обслуживает сайт, ориентированный на клиента. Каждый поступающий запрос в конечном итоге сводится к извлечению большого количества данных из Solr с использованием /sql обработчика, который предоставляет Solr. Как только мы извлекаем весь набор данных из Solr, мы записываем его обратно после его преобразования в кластер Cassandra. Это может быть преобразовано в проблему, которую можно решить с помощью потоков Akka, где потоком Solr из /sql обработчика будет akka Source , а хранилищем Cassandra будет Sink , а все промежуточное будет пользовательским Flow .

Я изучал потоки Akka и понимаю, что это реализация реактивных потоков. В первую очередь, то, как потоки Akka обеспечивают обратное давление, чтобы убедиться, что клиент не перегружен производителем. Теперь, что касается моего варианта использования, я хочу понять, как Akka обеспечивает обратное давление.

Насколько я понимаю, для Cassandra существует библиотека реактивных потоков. Поскольку в нашем случае это потребитель, этот драйвер сможет сигнализировать производителю о том, сколько данных он сможет получить. Это означало бы, что на стороне производителя должен быть соответствующий драйвер, который может реагировать на этот сигнал и управлять излучением элементов. В частности, поскольку производителем в нашем случае является Solr, разве не правильно, что мне также придется использовать совместимый с reactive драйвер Solr, который я могу использовать для извлечения документов из Solr и их потоковой передачи в моем приложении? Тогда этот драйвер сможет контролировать скорость, с которой он должен извлекать документы из кластера Solr всякий раз, когда драйвер Cassandra reactive сигнализирует ему о противодавлении. Разве это не правильно?

Если это действительно так, даст ли какие-либо преимущества использование потоков Akka без нереактивного драйвера на стороне производителя? В частности, существуют ли другие способы, которыми издатели Akka могут предоставлять возможности обратного давления в таких случаях, когда драйвер не совместим с reactive?

Комментарии:

1. Короче говоря, это возможно путем реализации реактивного расширения для sorl. Вся логика потоков akka может быть определена в рамках одного GraphStage см. Документы

Ответ №1:

Комментарии:

1. Я знаю о библиотеке. Я спрашиваю, что происходит, когда вы используете Akka streams без совместимого с reactive драйвера на стороне производителя.

2. Ну, это не будет работать без чего-то, что делает Source реактивным (что в основном означает на основе извлечения: Sink запрашивает данные, а вышестоящие этапы предоставляют данные или завершают поток, если они не могут предоставить ничего больше). Тем не менее, все, что можно повторить, можно Source довольно легко преобразовать в (например, с Source.fromIterator помощью).