Я пытаюсь создать симулятор торговли акциями с реакцией, узлом и 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?
И, пожалуйста, поправьте меня, если мой анализ неверен.