Как обновить значения внутри объекта в реальном времени с помощью socket.io - PullRequest
0 голосов
/ 13 октября 2018

Я пытаюсь создать симулятор торговли акциями с реакцией, узлом и socketIO, и мне нужно сохранить акции, которые есть у пользователя в объекте, подобном этому:

var user = { 
    name: "patrick",
    portfolio: [
        {
            ticker: "AAPL", 
            sharesOwned: 5, 
            currentPrice: {
                ticker: "MSFT", 
                sharesOwned: 10, 
                currentPrice: "120.12"
            }
        }
    ]
}

Проблема заключается в том,Я хотел бы отобразить список акций, которыми владеет пользователь, вместе с рыночной ценой CURRENT в режиме реального времени.


Я вроде как достигал этого, просто просматривая каждую акцию, которой владеет пользователь в бэкэнде, и вызывая API IEX, чтобы дать мне новую цену, и просто обновлял currentPrice, как это в цикле ever:

user.portfolio.currentPrice = await getStockPrice();

при условии, что я создал функцию с именем getStockPrice().Конечно, цикл будет обёрнут в асинхронную функцию для использования await.

При таком способе обновление списка происходит в реальном времени, но программе необходимо сначала просмотреть все акции, которыми владеет пользователь, затем вернуть новый портфель с обновленными ценами, а затем отправить клиенту через socketIO.Этот процесс происходит каждые ~3 секунд, а потоковая передача в реальном времени обрабатывается setInterval в бэкэнде, который синхронизируется каждые 4 секунды.

Глядя правильно, используя MongoDB, я мог бы изменить структуру данныххранить элементы следующим образом:

var user = { 
    name: "patrick",
    portfolio: {
        aapl: { shares: 5, currentPrice: 2121 }
        msft: { shares: 10, currentPrice: 24242 }
    }
}

Индексация здесь с помощью MongoDB даст мне O(logn), если я не ошибаюсь.Но мне все равно придется зацикливаться, чтобы узнать, какую цену акции я хочу получить, которая по-прежнему составляет O(n).

Итак, все вместе, я думаю, в итоге получается O(logn + n), что очень плохо для потокового приложения в реальном времени.

Как я могу обойти это, используя реагирование и сокет без необходимости зацикливаться и сохранять это как минимум O(logn) при условии, что мы не учитываем время, необходимое для ответа API?

И, пожалуйста, поправьте меня, если мой анализ неверен.

...