Выбор компромисса между уведомлениями «тянуть против толчка» - PullRequest
0 голосов
/ 21 мая 2019

Я пытаюсь найти решение для следующей проблемы.

У меня есть число N клиентов (число фиксируется где-то между 5000 и 6000) и Server.

На этом сервере есть локальные cache клиентов, где он хранит некоторые данные для каждого клиента.

public class Client
{
  public bool inGroup; 
}

Этот сервер периодически запрашивает некоторую базу данных и получает список этих clientsи он обновляет свой локальный кеш.Всякий раз, когда он обнаруживает расхождения (данные клиента - это просто bool) между cache и свежими данными из базы данных, он должен информировать конкретных клиентов.

Теперь я не знаю, следует ли мне реализоватьрешение на основе PULL или PUSH.Если выбрать PULL, то это означает, что каждый клиент будет опрашивать сервер с фиксированным интервалом где-то около 30 минут.Это будет означать 30 / 6000 = 300 ms между каждым запросом.

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

Рабочие часы клиентов также аналогичны, поэтомуэто также означало бы, что в целевые часы будут всплески, когда каждый клиент отправит свои IP и PORT на сервер, чтобы проверить, был ли он модифицирован.

Есть ли какое-либо другое промежуточное решение?И если нет, то каким будет хорошее решение:

  • Число клиентов довольно постоянное (5000-6000)
  • Клиенты IP и PORT обычно не меняются.
  • Клиенты будут запрашивать сервер один раз в 30 минут, если на основе Pull
  • Сервер будет запрашивать базу данных каждые 1 минуту и ​​отправлять запросы целевым клиентам, если на основе Push

1 Ответ

1 голос
/ 16 июня 2019

Среднее решение будет использовать длинный опрос . Клиент по-прежнему выдает запрос на опрос, и сервер немедленно возвращает его, если есть уведомление, ожидающее этого клиента. Но если уведомления нет, запрос блокируется на некоторое время (скажем, две минуты). Если в это время появятся новые уведомления, то клиентский запрос разблокируется, и новые данные будут возвращены. В противном случае запрос возвращает пустой результат через две минуты и выдает новый запрос.

Этот подход используется многими крупными сервисами, такими как AWS SQS .

...