#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, также необязательно для потоковой передачи данных в реальном времени