Контроль количества вызовов, проходящих через ваш программный коммутатор, является очень важной функцией, и для того, чтобы гарантировать, что реальное количество вызовов, которые были маршрутизированы, равно ожидаемому, вам необходимо понимать механизм управления скоростью CPS.
Проблема здесь кроется в непредсказуемых всплесках новых вызовов, поступающих на софтсвитч. Эти всплески должны обрабатываться должным образом, чтобы убедиться, что меньшее количество вызовов отклонено, а значение CPS не превышено.
Например:
В течение 1 минуты мы получили 60 звонков. И мы ожидаем, что это значение соответствует 1 CPS. Однако мы можем получить 50 звонков за 5 секунд и 10 звонков в течение следующих 55.
Должен ли программный коммутатор отклонять 45 из 50 вызовов, поступивших за 5 секунд?
В этой ситуации наши разработчики создали механизм, который динамически контролирует скорость вызова. Это называется корзина токенов. Корзина заполнена токенами, и количество токенов в ведре зависит от значения CPS. Корзина постоянно линейно пополняется новыми токенами, чтобы гарантировать, что оно заполнено. Емкость корзины равна значению CPS, умноженному на стоимость звонка в токенах и умноженному на 60 секунд. Корзина не может содержать больше токенов, чем его вместимость. Каждый вызов имеет свою стоимость в токенах. Чтобы передать вызовы, нам нужно получить определенное количество токенов из корзины. Если необходимой суммы нет - вызов будет отклонен.
А теперь простой пример:
CPS равен 1, и корзина заполнена.
Один звонок стоит 100 токенов.
Скорость заполнения ковша равна CPS * Стоимость звонка (100 токенов в секунду).
Размер корзины: CPS * Стоимость звонка * 60 секунд (6000 токенов)
Теперь, если бы мы получили 50 звонков за 5 секунд, все они прошли бы. Однако в ведре останется только 1500 токенов (уменьшится на 5000 токенов при вызовах и увеличится на 500 токенов при повторном заполнении потока).
Если мы получим еще одну порцию из 55 вызовов в течение следующих 5 секунд, пройдут только 20 из них, а остальные будут отклонены, однако, если порция будет меньше (10 вызовов в течение следующих 50 секунд), все они пройдут успешно.