RoboTradeCode / flash-gate

Торговый шлюз для биржы Exmo
0 stars 1 forks source link

Rate-limitter для 1 одного и того же адреса во всех пулах #63

Closed 81xx closed 2 years ago

81xx commented 2 years ago

В текущей версии гейта не предусмотрена ситуация, что гейт контролирует ограничения если во всех пулах указан один и тот же IP адрес. Пользователь может сам указать какие-то ограничения, но может быть ситуация при которой, например, ядро отправит 100 адресов и использует весь лимит адреса.

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

nomnoms12 commented 2 years ago

В плане удобства, Redis мне очень нравится. По умолчанию он не требует авторизации / создания пользователей / конфигурирования и т.д.

После установки его сразу можно использовать

81xx commented 2 years ago

В плане удобства, Redis мне очень нравится. По умолчанию он не требует авторизации / создания пользователей / конфигурирования и т.д.

После установки его сразу можно использовать

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

nomnoms12 commented 2 years ago

В Redis, кстати, можно будет перенести хранение соответствий event_id => order_id и order_id => id

idvlab commented 2 years ago

У нас уже есть memcache в стеке, Максим его активно использует. Предлагаю использовать что-то одно, если memcache не устраивает, давайте обсудим на митинге.

81xx commented 2 years ago

У нас уже есть memcache в стеке, Максим его активно использует. Предлагаю использовать что-то одно, если memcache не устраивает, предлагаю обсудить на митинге.

мы уже мельком обсудили, и дело в том, что memcache для php, а radis более облюблен питонистами.

81xx commented 2 years ago

@idvlab но если что можно обсудить это отдельно.

nomnoms12 commented 2 years ago

В мире Python люди больше любят Redis :)

Это не принципиально. Можно использовать и Memcached, для него есть библиотеки на Python.

Каких-то проблем от совместного использования обоих хранилищ на одном сервере нет

81xx commented 2 years ago

nomnoms12

я memcache не работал, если не будет проблем использовать на одном сервере, то лучше тогда что-то одно использоватью.

idvlab commented 2 years ago

@idvlab но если что можно обсудить это отдельно.

Насколько я понимаю, есть pymemcache, который хорошо работает и глобально ничем от редиса не отличается (в редисе чуть больше функционала типа pub, sub, но нам это не нужно). Более того, мы делали замеры, memcache чуть-чуть быстрее. В общем, лучше всем вместе обсудить.

nomnoms12 commented 2 years ago

Хорошее сравнение от Amazon: https://aws.amazon.com/ru/elasticache/redis-vs-memcached/

Из интересного: Redis в отличие от Memcached, поддерживает сохранение данных на диск:

With Redis you can keep your data on disk with a point in time snapshot which can be used for archiving or recovery.

То есть после перезагрузки сервера информация о всех ордерах будет сохранена

81xx commented 2 years ago

То есть после перезагрузки сервера информация о всех ордерах будет сохранена

Ну для нас это важно.

kleninmaxim commented 2 years ago

Memcached в ядро мы выбрали, потому что он чуть быстрее redis. Если сервер перезагрузится, то ничего страшного для ядра нет, ядро отменит все ордера и получит балансы (на данный момент, если сервер перезапустится, ядро по умолчанию не будет запущено). Перезагрузка сервера очень редко происходит и в таком случае нужно устранять ошибки, чтобы не перезапускался. Глобально, сильных отличий нет.

Так как, в ядро мы взяли memcached, предлагаю в гейте брать тоже memcached.

nomnoms12 commented 2 years ago

Перешёл на использование Memcached в гейте

nomnoms12 commented 2 years ago

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

Любые запросы ядра выполняются в приоритете и без задержек.

Соответственно, нет практического смысла в том, чтобы указывать один IP-адрес в нескольких пулах и глобально контролировать его ограничение. У нас не будет нескольких пулов

nomnoms12 commented 2 years ago

Задача по уменьшению задержек сейчас решается добавлением списка токенов: https://github.com/RoboTradeCode/flash-gate/issues/74