dimhold.by
← Артыкулы

199 запытаў пры ліміце 100, і ніхто не атакаваў

Мне спатрэбілася абмежаванне хуткасці, і я напісаў варыянт на 3 радкі: лічыльнік і пачатак бягучага акна. На рэўю прагучалі словы пра праблему мяжы, я перайшоў на токен-бакет, усе паківалі, праўка з’ехала. Пры гэтым я не змог бы сказаць, колькі прапускае любы з двух. Таму сабраў іх усе і падаў на кожны 4 формы трафіку.

Ліміт усюды адзін: 100 запытаў за 60 секунд. Мераю я не тое, колькі запытаў прайшло ўсяго, а найгоршыя 60 секунд у патоку прапушчаных, бо менавіта гэты лік давядзецца перажыць сэрвісу за абмежавальнікам.

найгоршыя 60 секунд з прапушчаных, ліміт 100 мяжа роўны 2x выпадковы 1.5x пачка акно-лічыльнік 200 100 128 100 журнал адзнак 100 100 100 100 токен-бакет, ёмістасць 100 101 199 177 100 токен-бакет, ёмістасць 10 11 109 109 10 пазначана: двое прапускаюць падвойную норму, трэці рэжа 90 адсоткаў законнай пачкі
У кожнага радка, апроч журнала адзнак, ёсць слупок, дзе ён найгоршы ў табліцы. Апошні радок гэта не праток, а адваротная адмова: кліент, які маўчаў 9 хвілін, атрымлівае 10 запытаў са 100, на якія меў права.

Вядомая загана сапраўдная. Пакладзі 100 запытаў у апошнюю секунду аднаго акна і 100 у першую секунду наступнага. Лічыльнік прапусціць усе 200, бо з яго пункту гледжання гэта 2 розныя вокны па 100. Шэсцьдзясят секунд, якія ляжаць на мяжы, утрымліваюць падвойную норму.

Яшчэ яму патрэбны працаўнік, які ведае, дзе мяжа. На роўным патоку ўдвая вышэй за ліміт той жа лічыльнік не перавышае 100 ніколі.

Той, на які я перайшоў

Токен-бакет, наладжаны відавочным спосабам, то бок з ёмістасцю, роўнай ліміту, прапускае 199 за акно на простым роўным пераліве. Ні працаўніка, ні разліку часу, проста кліент шле хутчэй, чым яму належыць.

вядро поўнае 100 токенаў, разам + даліў за акно 100 за 60 с, па меры = 199 за 60 с памерана, не выведзена ёмістасць 100 199 ёмістасць 10 109 ёмістасць 1 100 па той жа арыфметыцы вядро дазваляе пачку памерам у сваю ёмістасць, а ёмістасць і ставяць роўнай ліміту
Вядро гэта сума двух лікаў: таго, што ў ім ляжала, і таго, што прыходзіць, пакуль яго тратяць. Ёмістасць памерам з ліміт азначае, што акно можа выплаціць двойчы.

Арыфметыка перастае быць тонкай, як толькі лік аказваецца перад вачыма. Вядро ўваходзіць у акно поўным, і гэтая ёмістасць тратіцца адразу. Даліваецца яно роўна на ліміт за акно, і далітае тратіцца па меры паступлення. Ёмістасць плюс даліў гэта тое, што акно здольнае выплаціць. Пастаў ёмістасць роўнай ліміту, і адказ будзе падвойным.

Памяншэнне вядра гэта чыніць. Ёмістасць 10 трымае найгоршае акно на 109 на ўсіх формах, якія я падаваў.

Чым памяншэнне аплачана

Чацвёртая форма трафіку гэта кліент, які маўчыць 9 хвілін, а потым шле 300 запытаў запар. Прапусціць з іх 100 павінен любы абмежавальнік: кліент увесь гэты час быў ніжэй за ліміт і просіць роўна акно працы.

Акно-лічыльнік прапускае 100. Журнал адзнак прапускае 100. Вядро памерам з ліміт прапускае 100. Вядро, якое я ўціснуў да 10, прапускае 10 і адбівае 90 запытаў, на якія кліент меў права.

Вось і ўвесь размен у адным радку табліцы. Вялікае вядро шчодрае да ціхага кліента. Яно ж прапускае таго, хто пераліваецца, удвая. Малое вядро трымае рысу і карае роўна таго ветлівага, хто нічога не назапасіў.

Той, які не цячэ

Журнал адзнак прапускае роўна 100 на ўсіх 4 формах, і гэта тое, што ён абяцае: ён захоўвае адзнакі часу і лічыць, што адбывалася ў апошнія 60 секунд на самай справе.

Ён жа захоўвае да 100 адзнак на кліента. Па 8 байт гэта 800 байт супраць 16, якіх хапае лічыльніку з пачаткам акна. Ліку токенаў з часам даліву хапае тых жа 16. То бок у 50 разоў больш памяці на кліента плюс праход па пачатку спіса на кожным запыце. Гэта і ёсць цана абмежавальніка, у якога няма формы трафіку, дзе ён найгоршы ў табліцы.

Чаго я не правяраў

Усяго гэтага на некалькіх машынах, а патрэбна мне было менавіта там. 3 вузлы з лічыльнікам кожны гэта 3 вокны і патройны праток. Лечыцца або агульным сховішчам на гарачым шляху, або дзяленнем ліміту на 3, якое пры няроўным трафіку выкідвае дзве трэці дазволенага. Нічога з гэтага я не мераў. Яшчэ я даў кожнаму абмежавальніку ідэальны гадзіннік, а журнал адзнак роўна настолькі дакладны, наколькі дакладныя пададзеныя яму адзнакі.

Вузкае сцвярджэнне ў тым, што выбар ідзе не паміж зламаным абмежавальнікам і правільным. Кожны з таннных аказваецца найгоршым на нейкай форме трафіку. Якая форма дастанецца, тое і вырашыць, якую загану ты купіў.