Прослушивание изменений данных БД в Angular с использованием Rxjs или чего-либо еще - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть служба в бэкэнде (node.js). Я подписываюсь на нее через службу угловых HTTP-клиентов, и она работает нормально.для моего приложения более одного uers там. чтобы другой пользователь мог изменить данные БД.поэтому всякий раз, когда происходили изменения с данными БД, я хотел бы немедленно подписать их. , чтобы все пользователи могли просматривать непротиворечивые данные, то есть данные, синхронизированные с данными БД.Я использую RXJS Observables в угловых сервисах.

1 Ответ

0 голосов
/ 11 февраля 2019

Прежде чем перейти к ответу, имейте в виду, что выполнение вашего требования легче сказать, чем сделать.Реализация этого для существующей инфраструктуры будет большой работой, и если вам абсолютно необходимо это сделать, вероятно, лучше использовать существующие инфраструктуры на стороне сервера.

Подход с HTTP

HTTPэто неправильный протокол для этой задачи.Он основан на запросе / ответе и ожидает, что клиент узнает , когда он хотел бы запросить информацию.

Если вы должны использовать HTTP, я могу придумать только два пути.

Вариант 1: Создайте один HTTP-запрос, который никогда не будет закрыт, т. Е. В экспрессе сервер никогда не отправляет res.end() или что-то в этом роде.Этот подход также требует специального HTTP-клиента, так как по умолчанию Angular HTTP-клиент ожидает завершения запроса перед отправкой какого-либо уведомления подписчикам.Тем не менее, браузеры могут отключить запрос, если с сервера не отправлено никаких данных, поэтому вы должны реализовать функцию keep-alive самостоятельно.

Вариант 2: Использовать "опрос" - это означает, чтоВы постоянно спрашиваете свой сервер, изменились ли данные.Это может быть реализовано в RxJS с помощью:

interval(1000).pipe
  switchMap(() => this.http.get(...)
)

Это связано с огромным недостатком, заключающимся в том, что ваш сервер (а также ваша БД) должны обрабатывать много запросов, и ваш сетевой трафик увеличивается (хотя только небольшие пакетыпослал). Однако , это, вероятно, будет проще для вас реализовать, так как почти ничего не нужно менять для поддержки этого.Имейте в виду, что ваш сервер и база данных в какой-то момент выйдут из строя, если у вас одновременно будет слишком много пользователей.

Альтернативный подход с WebSockets

Браузер поддерживает только очень много протоколов, поэтомутолько ограниченное количество решений для вашего требования.Одним из них является WebSocket .В основном это протокол TCP через браузер, но он позволяет долгоживущим соединениям с возможностью для сервера передавать данных клиенту.Для этого есть даже класс в RxJS, который называется WebSocketSubject.

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

Примечание о базе данных

Мы говорили только о сетевом взаимодействии, но, конечно,Ваша база данных также должна поддерживать наблюдаемый API (за исключением метода опроса).Вам нужно заглянуть в документацию вашей конкретной системы баз данных, чтобы узнать, работает ли она.

...