So here is my issue. I have a requirement to essentially seed a Discourse production instance with around 200 posts at a time from a plugin admin action. These posts will be ‘created by’ 1 of 10 different regular users. The reason it’s a plugin action is because the users of this particular instance have a team of moderators they want to train up, and wanted some test posts to train them on, and the ability to seed more when they need them.
I got this working fine by passing skip_validations: true to PostCreator.new, however now there’s a requirement that some of the created posts are also flagged.
I first attempted to disable the RateLimiter but that was causing my action to crash the server process eventually, possibly when I was trying to turn it back on, and then I realised it probably wasn’t a good idea anyway.
So my question is, is there a better way to bypass the rate limiter when running some arbitrary code i.e. something like:
RateLimiter.bypass do
# run some code not affected by the rate limiter
end
Or do I need to basically just need to copy most of what the PostActionCreator is doing but leave out the troublesome line?
Any help would be greatly appreciated! I’m still absorbing a lot of the Discourse code so I’m aware I’ve probably missed something that makes this a lot easier!
Você descobriu isso? Modificar o arquivo yaml não é ideal, pois requer uma reconstrução. Eu não sou familiar o suficiente com rails/discourse para descobrir como desativá-lo temporariamente no console.
Tentando importar 60 mil usuários via API o mais rápido possível sem fazer um rebuild. Eu também tentei em uma instalação de teste aumentar o limite da API ADMIN via YAML, mas não pareceu funcionar, mas talvez eu tenha feito algo errado. (Estou executando as importações no container, então o throttling HTTP não deveria se aplicar).
Mas você pode entrar no contêiner e editar /var/www/discourse/config/discourse.conf e definir essas variáveis lá e depois fazer um sv restart unicorn (ou talvez sv reload unicorn). Provavelmente você vai querer fazer algo como apt-get update; apt-get install -y vim para ter um editor.
Estranho. Quando visualizo o arquivo de configuração, o novo limite já está definido. Então a atualização do YAML funcionou:
max_admin_api_reqs_per_key_per_minute = '6000'
Mas parece não funcionar. Ainda há uma limitação de 60 por minuto. Quando limito as requisições para 60 por minuto, a maioria passa, mas devido a oscilações, algumas ainda acionam o limitador de taxa:
{'success': True, 'active': True, 'message': 'Sua conta está ativada e pronta para uso.', 'user_id': 3596}
{'success': False, 'message': 'Novos registros não são permitidos do seu endereço IP (limite máximo atingido). Entre em contato com um membro da equipe.', 'errors': {'ip_address': ['Novos registros não são permitidos do seu endereço IP (limite máximo atingido). Entre em contato com um membro da equipe.']}, 'values': {'name': None, 'username': 'asdfd', 'email': 'user@domain.com'}, 'is_developer': False}
{'success': True, 'active': True, 'message': 'Sua conta está ativada e pronta para uso.', 'user_id': 3597}
Eu acho que está relacionado a outro limite: acho que é o limite máximo de registros de um IP que está sendo atingido, mas não entendo por que, depois de atingir esse limite, ele não bloqueia permanentemente. Possivelmente um bug neste limite de spam?
Se todos esses usuários tiverem o mesmo IP, então aposto que você está certo. Acho que a solução é alterar essa configuração ou dar às pessoas endereços IP falsos como 127.0.0.x (ou talvez usar IPv6 para facilitar?)
Eu acho que ele está detectando de onde a solicitação está sendo feita (computador host), mas posso contornar isso adicionando um usuário TL2 no mesmo endereço IP (ou ajustar o limite de IP).
Sim, vou tentar isso. Mas não está claro como devo executar o script, onde devo copiá-lo e como devo executá-lo (depois de colocar o CSV nos lugares certos)?
Apenas como acompanhamento, dado o esforço para entender os scripts e Ruby, etc., e o desempenho provável, segui outro caminho e contornei todos os limites escrevendo diretamente no banco de dados usando SQL. Desta forma, consegui várias milhares de inserções por segundo.
Houve um tópico perguntando quais tabelas eram necessárias, ele está fechado agora, então respondo aqui que alterei as seguintes tabelas para inserir os usuários: