Как хранить подключения к веб-сокетам для их фильтрации? - PullRequest
1 голос
/ 06 мая 2020

Я пытаюсь построить систему для транспортной компании. Компания имеет много грузовиков и доставляет товары в разные страны. Один из вариантов использования системы - отслеживать каждый грузовик и просматривать его положение в режиме реального времени. Итак, каждый грузовик отправляет данные GPS в Kafka topi c, используя "truck_id" в качестве ключа. Данные отправляются каждые 1 секунду.

Допустим, что это JSON, например:

{
    "truck_id": "STU_28",
    "plate": "ZH1234Z"
    "lat": 47.3688196,
    "lng": 8.5204119
}

Как я могу отправить эти данные в клиентское приложение? Это та часть, в которой я застреваю. Есть 3 клиента, веб-клиент, android клиент и ios клиент.

Это пример использования: один пользователь открывает веб-клиент и выбирает 3 грузовика из списка грузовиков. Затем нажимает кнопку, чтобы отобразить положение каждого грузовика в реальном времени на карте (я использую OpenStreetMap и Leaflet, чтобы показать карту).

Я выполнил поиск по этому поводу и обнаружил, что могу использовать веб-сокеты для отправки данных с сервера клиенту. Я создаю сервер NodeJS с использованием модуля websocket, но эти соединения хранятся в MemoryStore . Я хочу сохранить эти связи где-нибудь еще, чтобы получить их позже. Я нашел несколько решений, использующих Redis как PUB / SUB , но в тех решениях, где используется Socket.IO, я использую модуль websocket. Я знаю, что этот вариант использования представляет собой модель публикации / подписки .

Таким образом, грузовики публикуют sh данные (свои позиции), и пользователи подписываются на эти данные (для отображения на карте). Проблема в том, что существуют разные «группы» абонентов, например:

«user1» хочет показать местонахождение грузовиков [«STU_28», «STU_818», «ZFL_00_1»],

«user2» хочет показать местоположение только одного грузовика,

«user3» хочет показать местоположение 5 других грузовиков и т. Д. c.

Когда пользователь перемещается на другую страницу или выходит из веб-приложения, соединение с веб-сокетом необходимо прервать. Поэтому мне нужно удалить соединение из магазина. Также этот сервис (nodejs или другой) действует как потребитель Kafka, получает данные от Kafka topi c и отправляет их в приложение пользователя.

Псевдокод может быть таким:

KafkaConsumer consumer = new KafkaConsumer();
        
consumer.subscribe(topicName);
        
while(true) {
    // position is json data like above which contains "truck_id"
    position = consumer.poll();

    // go to websocket connection store and get all users(connections) that had searched(subscribed) to that "truck_id"
    connections = wsConnectionStore.getConnections(position.truck_id);
    
    for(WSConnection connection : connections) {
        connection.sendUTF(position);
    }
}

Как я могу этого добиться? Не обязательно быть в nodejs, это может быть java, python.

Примечание: система должна быть масштабируемой и высокодоступной.

...