Обновление данных Rails из Websocket без сохранения в базе данных

У меня есть поток данных о цене веб-сокета в мое приложение API для рельсов, которое я хочу обновлять, чтобы любые запросы API получали обновленный ответ. Было бы слишком дорого сохранять каждое обновление в базе данных. Как я могу это сделать? В Ember я могу изменить модель, и она сохраняется. Кажется, в рельсах этого не происходит.

Контроллер канала:

def receive(message)
  #ActionCable.server.broadcast('channel', message)

  platform = Platform.find(params[:id]);
  market = platform.markets.find_by market_name: message["market_name"]
  market.attributes = {
    market.price = message.values["price"],
    etc......
  }
  #market.save [this is too expensive every time]
end

Правильно ли я об этом говорю? Также кажется неэффективным использовать find каждый раз, когда я хочу обновить, что может происходить несколько раз в секунду. В Ember я создал массив поиска идентификаторов записей, чтобы быстро сопоставить market_name, я не понимаю, как это сделать в рельсах.


person Joshua Jenkins    schedule 27.10.2017    source источник


Ответы (1)


Сохранение в каком-либо хранилище — это единственный способ заставить другие потоки отвечать последним значением.

Вместо 3 запросов (2 selects и 1 update) вы можете сделать это всего за 1 update

Market.where(platform_id: params[:id], market_name: message["market_name"]).
       update_all(price: message.values["price"])

При правильном индексе у вас может быть производительность sub-ms для каждого обновления.

В зависимости от потребностей вашего бизнеса:

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

person Vijay Agrawal    schedule 27.10.2017
comment
Спасибо за сокращенный запрос. Если бы была добавлена ​​еще пара платформ, то можно было бы легко получить более 1000 обновлений в секунду. Я хочу иметь возможность использовать эти данные с очередью фоновых заданий, чтобы делать такие вещи, как оповещение внешнего интерфейса Ember о достигнутых уровнях цен или более сложных задачах. Сохранение обновлений в базе данных не сработает. Возможно, мне следует использовать Redis и реже сохранять в базу данных. - person Joshua Jenkins; 27.10.2017
comment
1000 per second намного ниже того, с чем может справиться большинство БД. - person Vijay Agrawal; 27.10.2017
comment
Если вы пойдете по пути Redis, возможно, вы вообще можете подумать о том, чтобы вообще не сохранять в базе данных SQL. - person Vijay Agrawal; 27.10.2017