#mysql #node.js #real-time
#mysql #node.js #в режиме реального времени
Вопрос:
Я работаю с пользовательскими учетными записями для телефонной системы, и мне нужно отключить пользователей, как только их баланс достигнет нуля.
- Пользователь инициирует вызов
- Восстановлен текущий баланс
- Рассчитывается цена за телефонный звонок и определяется, сколько целых минут пользователь может приобрести
- Затем время зависания сеанса сохраняется в базе данных
Мне нужно опрашивать базу данных (каждую секунду?) чтобы узнать, равно ли время зависания сеанса =< now().
Любой совет по частому опросу базы данных, в настоящее время я использую MySQL, но я готов измениться.
cron
не будет выполняться достаточно часто. Поскольку я буду получать счет за минуту, мне нужно убедиться, что время выполнения этого скрипта точное.
Я смотрел на node.js выполнять задачу, никогда не используя node — подходит ли это? Стоит ли использовать функцию публикации / подписки базы данных? (нельзя рисковать потерей данных, поскольку это означало бы, что пользователь может продолжать свой телефонный звонок вечно)
Приветствуются любые советы.
P.S все будет на стороне сервера. Не будет интерфейса для запуска запросов.
Ответ №1:
К сведению, возможно, вы подходите к этому неправильно. Насколько мне известно, то, что обычно делают операторы связи для выставления счетов, заключается в том, чтобы иметь в памяти снимок изменяемых данных вместе с периодическим пакетным обновлением для сохранения указанных данных по мере необходимости.
В терминах базы данных, думайте об этом как о работе с использованием прокси-таблицы, которая использует механизм памяти, с периодическим запуском / переименованием mem_table / созданием новой mem_table / фиксацией, за которым следует запуск / обновление static_table с использованием old_mem_table / удаление old_mem_table / фиксации.
Худшее, что может случиться, это потерять несколько минут выставления счетов. Преимущество заключается в том, что это избавляет жесткие диски от непрерывного чтения / записи (чего они все равно не могут сделать, учитывая пропускную способность, с которой они сталкиваются).
Что касается вашего (node.js ) проблема, в частности, в том, почему не использовать setInterval()?
Комментарии:
1. Проблема, с которой я сталкиваюсь, заключается в том, что у пользователей будет предоплаченная сумма кредита, которая приближается к нулю. Как только доходит до того, что мне нужно вручную отключить вызов, для этого мне нужно отправить команду REST. Я не совсем понимаю ваш ответ, однако, если я потеряю один идентификатор вызова из памяти, этот вызов потенциально может длиться вечно. У меня не будет никакого способа выставлять счета пользователям за пределами их предоплаченной суммы.
2. В качестве ответа я просто предлагаю (последняя строка) выполнить поиск с использованием javascript напрямую. Повторите бесконечный вызов, подумайте об этом так: если сервер базы данных выйдет из строя, все вызовы, вероятно, в любом случае будут прерваны; и в самом худшем случае горстка клиентов потратит час или два на разговор с другом в Зимбабве. Ваши жесткие диски будут благодарны.