Я использую Apache Flink в проекте фондовой биржи, чтобы рассчитать текущее изменение цен. Формула

 price_change = (current_price - previous_close_price) / previous_close_price

previous_close_price - цена закрытия ценной бумаги в предыдущий день торгов. Каждый день перед открытием маркета мне нужно обновлять previous_close_price.

Я придумал несколько решений, но не знаю, какое из них лучше.

  1. Сохраните previous_close_price в Redis и получайте цену при каждом расчете. Обновить цену легко и гибко, но это решение может убить производительность.

  2. Установите TTL состояния на 1 день. Получить новое состояние, когда истек срок действия старого. Но это не гибко, поскольку TTL жестко запрограммирован.

  3. Шаблон состояния трансляции. Я не уверен, работает ли это решение.

  4. Отправьте специальное сообщение для flink. Когда flink получает сообщение, он обновляет previous_close_price.

Любые предложения приветствуются.

3
Kanjie Lu 19 Ноя 2018 в 17:43

1 ответ

Лучший ответ

Предлагаю вариант №4:

Иметь два источника: один используется только для цен закрытия, а другой - для потока сделок. Закрепите оба потока безопасностью и соедините их с помощью CoProcessFunction. Сохраните previous_close_price в ключевом состоянии в CoProcessFunction.

Ежедневно перед открытием рынка транслируйте обновленные цены закрытия.

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

Что касается других подходов:

  1. Я не вижу никаких преимуществ в хранении данных previous_close_price во внешнем хранилище данных.
  2. Я не думаю, что это работает очень хорошо. Нет доступного хука для запуска загрузки новых данных, и, более того, состояние будет очищено только при доступе к нему.
  3. Это не похоже на хороший вариант использования состояния широковещания, если только не требуется, чтобы все в кластере знали цены закрытия для всех ценных бумаг.
4
David Anderson 19 Ноя 2018 в 19:43