Как реактивное программирование может реагировать на изменения базы данных?

#reactive-programming #project-reactor #spring-data-r2dbc

#реактивное программирование #проект-реактор #spring-data-r2dbc

Вопрос:

Я новичок в теме реактивного программирования и поэтому у меня есть несколько вопросов.

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

Итак, я посмотрел на проект Spring-reactor. Я также использую R2DBC для реактивного доступа к базе данных.

Я хотел бы знать, есть ли какой-либо способ, которым база данных реагирует на изменения.

Или, скорее: если пользователь сохраняет запись в базе данных, то серверы (например, RestController) должны быть уведомлены.

Как я мог бы это сделать?

Соответствующие контроллеры, конфигурация, объекты и т.д. Я уже реализовал.

Извините за орфографические ошибки.

Дополнение: Затем обновления интерфейса выполняются с помощью событий, отправляемых сервером.

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

1. Спасибо за ваш отличный вопрос. Одна вещь: Project Reactor не является проектом Spring и не зависит от Spring.

Ответ №1:

В основном, то, что упоминал Ник Цитлакидис. Позвольте мне добавить сюда пару вещей.

Типичным шаблоном запроса к базе данных является запрос количества записей. Базы данных отвечают своими результатами и указывают, что запрос завершен, как только сервер отправил все записи в ваше приложение. Если новые записи поступают во время активного запроса или после завершения запроса, вы не увидите эти изменения сразу из-за изоляции, и в случае завершения запроса у вас больше нет ссылки на запрос.

Функция, о которой вы спрашиваете, — это потребление данных, управляемое событиями. Базы данных вызывают эту функцию непрерывных запросов. Некоторые хранилища (такие как MongoDB с хвостовыми курсорами или логическое декодирование Postgres) поставляются с функциями, которые позволяют сохранять курсор / запрос открытым, и ваш клиент может получать непрерывные обновления.

Kafka и JMS также придерживаются идеи отправки (сообщений), которые обычно используются слушателями или даже через реактивный поток.

Итак, все сводится к используемой вами технологии.

Ответ №2:

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

Например, если у вас есть Service1 обновление базы данных, и Service2 необходимо ответить, то Service1 вы можете либо вызвать Service2 , либо отправить событие из Service1 и прослушать событие из Service2 .

Первый подход проще и удобнее в реализации, но у него есть недостаток, который объединяет две службы. Второе сложнее реализовать, но службы не связаны.

Reactor может помочь вам в обоих случаях : для событий reactor может предоставить вам способ прослушивания событий. Например, с использованием модуля reactor-rabbitmq или reactor-kafka. Для вызовов между сервисами вам может помочь reactor, если вы используете Spring Webflux.

Возможно, вы можете рассказать нам больше о вашем случае, чтобы мы могли предложить более конкретное решение?

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

1. Использование базы данных с push-архитектурой, такой как RethinkDB, также необязательно для потоковой передачи данных в реальном времени