Диагностика прерывистого / «отставшего» сбора данных Websocket - PullRequest
0 голосов
/ 17 мая 2018

Я собираю торговые данные из широкого спектра криптовалютных бирж через веб-сокеты и затем сохраняю их в файлы .csv. Это работает для всех бирж уже две недели, за исключением моего скрипта Bitfinex ниже.

import websocket
import pandas as pd
import json
import time
import datetime
import os

df = pd.DataFrame(columns=['id','time','amount','price'])
trades = []
folder = r'/realtimedata/trades/bitfinex/btcusd/bitfinex_btcusd_trades_'
def on_message(ws, message):
    msg = json.loads(message)
    if msg[1] == 'te':
        print("Bitfinex BTCUSD Trades - "+str(msg[2]))
        global df
        trades.append(msg[2])
        df = pd.DataFrame(trades)
        df = df[-1:]
        df = df.drop(0,axis=1)
        if not os.path.isfile(folder + str(datetime.datetime.today().strftime('%Y_%m_%d') + '.csv')):
           df.to_csv(folder + str(datetime.datetime.today().strftime('%Y_%m_%d') + '.csv'),header ='column_names', index=False)
        else: # else it exists so append without writing the header
            df.to_csv(folder + str(datetime.datetime.today().strftime('%Y_%m_%d') + '.csv'),mode = 'a',header=False, index=False)

def on_error(ws, error):
    print(error)

def on_close(ws):
    print("### closed ###")

def on_open(ws):
    ws.send(json.dumps({"event":"subscribe", "channel":"trades", "pair":"BTCUSD"}))

while True:
    if __name__ == "__main__":
        ws = websocket.WebSocketApp("wss://api.bitfinex.com/ws/2",
                                    on_message=on_message,
                                    on_error=on_error,
                                    on_close=on_close)
        ws.on_open = on_open
        ws.run_forever()

Результат этого в течение нескольких дней выглядит следующим образом: this Как вы можете видеть, после того, как в течение первых 3,5 дней он работал отлично, он начинает периодически пропускать часы, и я нахожусь в потеря относительно того, почему или как это исправить, особенно если учесть, что мои другие идентичные сценарии для других обменов работают.

Поскольку это нечасто и может работать часами, у меня нет примеров ошибок / сообщений / подсказок относительно того, что происходит, когда запись не ведется. Я предоставлю как можно больше информации.

  • Перезапуск сценария полностью работал в течение последних 12 часов (возможно, скоро снова выйдет из строя?)
  • Когда я проверял временные метки входящих сообщений перед перезапуском .. они не были текущего времени. Они отставали, поскольку я принимал их на X часов.
  • Я собираю BTC и ETH двумя сценариями на Bitfinex таким способом. Одна и та же проблема возникла в обоих случаях, но в разное время.
  • Это все работает на сервере AWS t2.medium в tmux, где одновременно работают 10 других сценариев.

Я надеюсь, что у кого-то с большим опытом может быть предложение, как это исправить. Я не против пропустить несколько секунд здесь и там, если есть хакерский обходной путь. Могу я просто автоматически закрывать / перезапускать скрипт каждые 24 часа? Как бы я поступил так?

Спасибо.

Edit

1 Ответ

0 голосов
/ 17 мая 2018

Что ж, производительность сети у экземпляров t2.medium очень низкая, а загрузка ЦП является взрывоопасной, поэтому, если вы используете все свои кредиты, производительность снижается, и система замедляется.Подумайте об использовании экземпляра с более высокой производительностью.

Чтобы диагностировать проблему потери пакетов, лучше всего активировать vpc-flow-logs, это похоже на анализатор, вставленный в вашу сеть, чтобы вы могли отслеживать все пакеты, которые нужно сделать.это см https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/flow-logs.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...