forum.bitel.ru
http://forum.bitel.ru/

Продление подписки
http://forum.bitel.ru/viewtopic.php?f=60&t=11650
Страница 1 из 1

Автор:  barguzin2 [ 02 июн 2016, 13:20 ]
Заголовок сообщения:  Продление подписки

Есть подписки продолжительностью 30 дней. Подходит час Х, ждём автопродления, но он не срабатывает. Стал разбираться что не так, оказалось SubscriptionJob выполняется раньше назначенного времени на несколько секунд, ну и, соответственно, новый период активировать не может, т.к. текущий еще активен.
Код:
mysql> select * from subscription_job_trigger_14 where id=58;
+-----+-------+----------------+--------------+------------+------+------+--------------------+--------------------+-----------+---------+
| id  | jobId | timeFromMillis | timeToMillis | persistent | type | data | fireTimePrevMillis | fireTimeNextMillis | fireCount | version |
+-----+-------+----------------+--------------+------------+------+------+--------------------+--------------------+-----------+---------+
|  58 |    58 |  1464835020000 |            0 |          1 |    0 | NULL |                  0 |                  0 |         0 |       1 |
+-----+-------+----------------+--------------+------------+------+------+--------------------+--------------------+-----------+---------+

а это после срабатывания
Код:
+----+-------+----------------+---------------+------------+------+------+--------------------+--------------------+-----------+---------+
| id | jobId | timeFromMillis | timeToMillis  | persistent | type | data | fireTimePrevMillis | fireTimeNextMillis | fireCount | version |
+----+-------+----------------+---------------+------------+------+------+--------------------+--------------------+-----------+---------+
| 58 |    58 |  1464835020000 | 1464835013492 |          1 |    0 | NULL |      1464835013492 |                  0 |         1 |       1 |
+----+-------+----------------+---------------+------------+------+------+--------------------+--------------------+-----------+---------+


В итоге, вместо 10:37:00 задача запустилась в 10.36:53. Другая вообще на 12 секунд раньше стартанула. И так со всеми. Как так получается ?
Версия 6.0

Автор:  skn [ 02 июн 2016, 16:18 ]
Заголовок сообщения:  Re: Продление подписки

предположительно проблема связана с корректировкой системного времени на компьютере
(если оно происходит в период часа до назначенного времени выполнения job`а)

Автор:  barguzin2 [ 02 июн 2016, 16:39 ]
Заголовок сообщения:  Re: Продление подписки

Была такая мысль. Надо поиграться с изменением времени. На сервере периодически синхронизируется время через ntpdate раз в 5 минут. Убежать за последний час до запуска задачи суммарно с учетом синхронизации на 7-12 секунд время не должно. Заменил его на полноценный ntpd, но, тем не менее, это не есть правильно, что коррекция времени так сильно влияет на результирующее время выполнения задачи. Какой-то сильно жесткий алгоритм получается, там ведь на 1 секунду разойдётся если и всё, не активируется новый период. Неправильно всё это...

Автор:  skn [ 02 июн 2016, 17:21 ]
Заголовок сообщения:  Re: Продление подписки

немного подправили код, попробуйте... может поможет.

Автор:  barguzin2 [ 03 июн 2016, 12:51 ]
Заголовок сообщения:  Re: Продление подписки

Проверил. Действительно, из-за времени это всё происходит. Активировал период и перевел время на пару минут назад, описанная ситуация воспроизвелась. Вот только ваша неправда, что если коррекция происходит в последний час. Запускал одну подписку двухчасовую, вторая вообще суточная. Время перевел сразу после запуска первой вчера вечером, вторая была запущена вчера еще днём. Обе не продлились, задача в обоих случаях запустилась раньше на одно и тоже время сдвига времени.

Отсюда можно делать вывод, что коррекция времени тут не совсем во всём виновата. На сервере периодически синхронизируется время (это давно настроено, раз в 5 минут запуск ntpdate), и на момент запуска оно было правильным (за 5 минут убежать/отстать на сколь-либо существенное значение не может), но есть тенденция к опережению. Так вот, это опережение корректируется периодически (и думаю неважно, ntpdate это или ntpd), а SubscriptionJob, так полагаю (поправьте, если не так) не смотрит текущее время, а просто запускает таймер и ждёт следующей задачи, ну а так как внутренние часы компьютера спешат, то задача по сути выполняется раньше назначенного срока, как раз за месяц часы на 7-10 секунд вперед могут убежать, если бы не синхронизировались.

И если всё это так, то нужно менять алгоритм, чтобы задача активировалась именно в назначенное время. Ваше исправление работает только в одном случае - как раз в моём. А если бы внутренние часы отставали, то задача выполнялась бы позже времени окончания. Проверил это так - после активации периода перевел время вперед и получил описанное несоответствие. В общем, хотели как лучше всё до миллисекунд уточнить, а получили как всегда расхождение в секунды.

Автор:  skn [ 03 июн 2016, 14:38 ]
Заголовок сообщения:  Re: Продление подписки

странно....
спец который делал подсистему job говорит, что задания считываются из БД раз в час (выбираются задания которые должны быть вынолненны в ближайший час), и в этот момент берется заданное время и текущее, находится разница и задача добавляется в планировщик, типа выполнится через такое то время (заданное минус текущее), поэтому если с момента считывания из базы системное время поменяется, то задание может быть выполнено в неправильное время, описанная вами ситуация не понятна....

Автор:  barguzin2 [ 03 июн 2016, 15:07 ]
Заголовок сообщения:  Re: Продление подписки

Проверьте сами. Сделайте двухчасовую подписку, активируйте период и переведите время на 2 минуты назад. Я так делал, ну там не 2 минуты у меня, полторы получилось, до 00 секунд округлял. Синхронизация времени была выключена, т.е. системное время и таймеры планировщика Job шли одинаково в такт. По скринам - тестировались подписки 84 и 94. Завершились вместо 11:31:00 и 02:52:00 в 11:28:28 и 02:49:28 соответственно. Это еще без обновления было, поэтому они закончились раньше времени и не продлились.
Код:
BGBillingServer v 6.0 build 1877 from 15.04.2016 23:41:38
Started: 03.06.2016 00:33:05    Uptime: 0 d 15:24:43


Вложения:
2016-06-03_15-55-44.png
2016-06-03_15-55-44.png [ 9.68 КБ | Просмотров: 6905 ]
2016-06-03_15-54-43.png
2016-06-03_15-54-43.png [ 10.34 КБ | Просмотров: 6905 ]

Автор:  vkulakov [ 27 июл 2016, 20:26 ]
Заголовок сообщения:  Re: Продление подписки

Продолжение то будет? Не хочется на эти же баги напороться.

Автор:  stark [ 27 июл 2016, 20:56 ]
Заголовок сообщения:  Re: Продление подписки

Мы можем увеличить частоту считывания задач. Сейчас мы это делаем раз в час. Можно сделать этот параметр настраиваемым. Например будем считывать их раз в минуту , это повысит точность.

Автор:  skn [ 27 июл 2016, 22:26 ]
Заголовок сообщения:  Re: Продление подписки

vkulakov писал(а):
Продолжение то будет? Не хочется на эти же баги напороться.


какое продолжение?

Автор:  vkulakov [ 28 июл 2016, 13:34 ]
Заголовок сообщения:  Re: Продление подписки

В теме озвучена проблема: автопродление не срабатывает, если время на сервере и ещё где-то расходится на пару минут. В теме проблема не решена: либо barguzin2 забил совсем на модуль, либо написал свой костыль, либо ушёл в запой.

Сейчас я хочу понять текущее положение дел с озвученной проблемой - что сделал barguzin2 и что сделали разработчики для решения проблемы. Как я понял, разработчики ничего не сделали, но вот barguzin2...

Автор:  barguzin2 [ 28 июл 2016, 13:41 ]
Заголовок сообщения:  Re: Продление подписки

stark писал(а):
Мы можем увеличить частоту считывания задач. Сейчас мы это делаем раз в час. Можно сделать этот параметр настраиваемым. Например будем считывать их раз в минуту , это повысит точность.


Это так и было или исправили? Раньше тоже говорили, что раз в час, но я проверял (скрины выше) больше часа и нифига. Но делать что-то нужно, т.к. системные часы неточные, а отсчёт до выполнения Job ведется по ним без учета синхронизации, отсюда такая петрушка.

Автор:  skn [ 28 июл 2016, 17:50 ]
Заголовок сообщения:  Re: Продление подписки

barguzin2 писал(а):
stark писал(а):
Мы можем увеличить частоту считывания задач. Сейчас мы это делаем раз в час. Можно сделать этот параметр настраиваемым. Например будем считывать их раз в минуту , это повысит точность.


Это так и было или исправили? Раньше тоже говорили, что раз в час, но я проверял (скрины выше) больше часа и нифига. Но делать что-то нужно, т.к. системные часы неточные, а отсчёт до выполнения Job ведется по ним без учета синхронизации, отсюда такая петрушка.


кое что подправили, насколько помогло не в курсе,
все молчат т.е. то ли все работает, то ли не кому не нужно...

Страница 1 из 1 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/