Принцип тот же, что и в "вонющих чатиках".
Это можно сделать через socet (io или web) - как удобнее, можно вообще через setInterval, если хочешь - на нем немного по другому будет устроен, но результат тот же.
Подписываешь пользователя на определенной событие (допустим на обновление валюты) и когда прилетает на бекенд новые данные по валюте, то ты просто посылаешь сообщение, либо с данными, либо с триггером на обновление.
В твоем случае, на бекенде при каждом инстерт/апдейт запросе в бд/таблицу нужно вешать сендер о событии, а там уже посылаешь триггер на обновление всей сторы или в триггере указываешь какую часть надо обновить. А там дальше можешь уже развивать, в случае реконнекта - посылаешь состояние пользователя и уже, на основе состояния, бекенд сообщает о наличии новых данных.
Развивать эту тему можно долго и усложнять схему можно до бесконечности. Но, принцип ничем не отличается от реализации "вонючих чатиков", главное доставить ивент об изменении с указанием действий.