В настоящее время я работаю над расширением моего существующего REST API, созданного с помощью Flask-RESTPlus, с поддержкой WebSocket. Идея состоит в том, чтобы создать модель Web Thing (Gateway ). «Вещи» в моем случае использования динамически добавляются или удаляются.
Текущая настройка позволяет потребителю получать последние значения из вещи, например. датчик температуры, используя HTTP-запрос GET к /thingId/properties/temperature. Значения на самом деле потребляются из Kafka и временно хранятся в Redis.
Теперь мне интересно, как я могу расширить эту настройку и позволить потребителю не только опрашивать последние значения, но и подписываться на свойство Thing с помощью WebSockets. У меня есть рабочее решение, в котором я создаю «Комнаты» для каждого свойства, но для этого требуются два отдельных сервера и дублирование конечных точек.
Для REST у меня
@app.route('/<thingId>/properties/<propertyId>')
# get latest datapoint
return latestDatapoint
Для Flask-SocketIO у меня
@socketio.on('join')
def on_join(data):
username = data['username']
room = data['room'] # e.g. /thingId/properties/temperature
join_room(room)
send(username + ' has entered the room.', room=room)
а затем я пересылаю данные в нужную комнату по мере их поступления от Кафки. Затем на стороне клиента мне нужно подключиться к серверу WebSocket и присоединиться к комнате.
socket.on('connection', function(socket){
socket.emit('join', 'some room');
});
Эта реализация работает, но я очень надеялся на альтернативный рабочий процесс, как показано на рисунке ниже, где клиент подключается к той же конечной точке, что и в REST API, но с протоколом WebSocket вместо присоединения к комнатам и т. д.
Есть ли у вас какие-либо идеи, если это уже существует или возможно реализовать?