#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:
Для Solr также существует полностью реактивная реализация Akka Streams из проекта Alpakka, поэтому ее использование в качестве средства Source
обработки противодавления, хотя это означало бы не использовать интерфейс SQL для выражения запроса.
С другой стороны, поскольку интерфейс Solr SQL по сути является фасадом JDBC, использующим Solr, можно использовать интеграцию Alpakka Slick, если вы определяете экземпляр slick.jdbc.JdbcProfile
, который использует драйвер Solr JDBC.
Комментарии:
1. Я знаю о библиотеке. Я спрашиваю, что происходит, когда вы используете Akka streams без совместимого с reactive драйвера на стороне производителя.
2. Ну, это не будет работать без чего-то, что делает
Source
реактивным (что в основном означает на основе извлечения:Sink
запрашивает данные, а вышестоящие этапы предоставляют данные или завершают поток, если они не могут предоставить ничего больше). Тем не менее, все, что можно повторить, можноSource
довольно легко преобразовать в (например, сSource.fromIterator
помощью).