Итак, у нас есть вариант использования в наших производственных системах, где мы, вероятно, могли бы использовать потоки Akka. Чтобы понять, как потоки Akka обеспечивают обратное давление, я хотел бы углубиться в наши требования.
У нас есть кластер Solr, в котором хранятся некоторые наши данные. Затем у нас есть приложение Play, которое обслуживает интерфейсный сайт, ориентированный на клиентов. Каждый входящий запрос в конечном итоге сводится к получению большого количества данных из Solr с использованием _ 1_ обработчик, который предоставляет Solr. Как только мы получаем весь набор данных из Solr, мы записываем его обратно после морфинга в кластер Cassandra. Это может быть преобразовано в проблему, которую можно решить с помощью потоков Akka, где поток Solr из обработчика /sql
будет akka Source
, а хранилище Cassandra будет Sink
, а все, что между ними, будет настраиваемым Flow
s.
Я изучал потоки Akka и понял, что это реализация реактивных потоков. В частности, то, как потоки Akka обеспечивают обратное давление, чтобы гарантировать, что производитель не перегружен потребителем. Теперь, что касается моего варианта использования, я хочу понять, как Akka обеспечивает обратное давление.
Насколько я понимаю, есть библиотека реактивных потоков для Cassandra. Поскольку в нашем случае это потребитель, этот драйвер сможет сигнализировать производителю о том, сколько данных он сможет получить. Это означает, что на стороне производителя должен быть соответствующий драйвер, который может реагировать на этот сигнал и управлять излучением элементов. В частности, поскольку производителем в нашем случае является Solr, разве не правильно, что мне также придется использовать совместимый с реактивностью драйвер Solr, который я могу использовать для извлечения документов из Solr и потоковой передачи их в моем приложении? Затем этот драйвер сможет управлять скоростью, с которой он должен получать документы из кластера Solr всякий раз, когда реактивный драйвер Cassandra сигнализирует ему о противодавлении. Это не так?
Если это действительно так, принесет ли использование потоков Akka без нереактивного драйвера на стороне производителя какие-либо преимущества? В частности, существуют ли другие способы, которыми издатели Akka могут предоставить возможности противодавления в таких случаях, когда драйвер не соответствует требованиям к реактивности?
GraphStage
см. docs < / а> - person Ivan Stanislavciuc   schedule 20.09.2020