¿Alguna forma de desactivar temporalmente RateLimiter para creación en masa por parte del administrador?

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’m using PostActionCreator.create to flag some of these posts, but now I’m getting hit by the rate limiter here: https://github.com/discourse/discourse/blob/ad7a13921f2af8c792530c84386b64911c8e7ea2/lib/post_action_creator.rb#L69

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!

1 me gusta

What I’d likely do is run a script in the Rails console. Have you checked out: Global rate limits and throttling in Discourse? It looks like you can change those rate limits.

2 Me gusta

This isn’t really a path I want to go down as I want it to initiated by users rather than them relying on me to run a script in the console.

3 Me gusta

Did you look at the link about changing the rate limits?

¿Descubriste esto? Modificar el archivo yaml no es ideal ya que requiere una reconstrucción. No estoy lo suficientemente familiarizado con rails/discourse para descubrir cómo deshabilitarlo temporalmente en la consola.

¿Cuál es su caso de uso? ¿Qué problema intenta resolver que los límites de velocidad le impiden?

Intentando importar 60 000 usuarios a través de la API lo más rápido posible sin reconstruir. También intenté en una instalación de prueba aumentar el límite de la API de ADMIN a través de YAML, pero no pareció funcionar, aunque quizás hice algo mal. (Estoy ejecutando importaciones en el contenedor, por lo que la limitación de HTTP no debería aplicarse).

Esto no es muy útil, pero lo que haría sería crear los usuarios en Rails en lugar de a través de la API. discourse/script/import_scripts/csv_importer.rb at main · discourse/discourse · GitHub podría ser un comienzo.

Pero puedes entrar en el contenedor y editar /var/www/discourse/config/discourse.conf y establecer esas variables allí y luego hacer un sv restart unicorn (o quizás sv reload unicorn). Probablemente querrás hacer algo como apt-get update; apt-get install -y vim para tener un editor.

2 Me gusta

Extraño. Cuando veo el archivo de configuración, el nuevo límite ya está establecido. Así que la actualización de YAML funcionó:

max_admin_api_reqs_per_key_per_minute = '6000'

Pero no parece funcionar. Todavía hay una limitación de 60 por minuto. Cuando limito las solicitudes a 60 por minuto, la mayoría se procesa, pero debido a la fluctuación, algunas aún activan el limitador de velocidad:

{'success': True, 'active': True, 'message': 'Your account is activated and ready to use.', 'user_id': 3596}
{'success': False, 'message': ' New registrations are not allowed from your IP address (maximum limit reached). Contact a staff member.', 'errors': {'ip_address': ['New registrations are not allowed from your IP address (maximum limit reached). Contact a staff member.']}, 'values': {'name': None, 'username': 'asdfd', 'email': 'user@domain.com'}, 'is_developer': False}
{'success': True, 'active': True, 'message': 'Your account is activated and ready to use.', 'user_id': 3597}

Me pregunto si es un problema con las comillas.

Podrías revisar SiteSettings.max_admin_api_reqs_per_key_per_minute y ver si es un entero.

1 me gusta

en default_current_user_provider.rb (el único archivo que encontré que parecía hacer referencia a este valor, tiene:

limit = GlobalSetting.max_admin_api_reqs_per_minute.to_i

así que parece convertirlo. Incluso intenté reemplazarlo con un número en el código.

1 me gusta

Maldición. Temía eso.

1 me gusta

Creo que está relacionado con otro límite: creo que es el límite de registros máximos desde una IP el que está alcanzando, pero no entiendo por qué después de alcanzarlo no se bloquea permanentemente. ¿Posiblemente un error en este límite de spam?

Si todos esos usuarios tienen la misma IP, entonces apuesto a que tienes razón. Creo que la solución es cambiar esa configuración o dar a la gente direcciones IP falsas como 127.0.0.x (¿o quizás usar IPv6 para que sea más fácil?).

1 me gusta

Creo que está detectando desde dónde se realiza la solicitud (computadora host), pero puedo evitarlo agregando un usuario TL2 en la misma dirección IP (o ajustando el límite de IP).

La API de usuario es muy lenta, sin embargo.

Por eso recomiendo hacerlo en Rails. Probablemente haga unos 500 por minuto.

1 me gusta

Sí, lo intentaré. Pero no tengo claro cómo se supone que debo ejecutar el script, ¿dónde debo copiarlo y cómo lo ejecuto (una vez que ponga el CSV en los lugares correctos)?

Puedes ver otros temas de ayuda para los demás. Casi todos funcionan igual.

1 me gusta

Como seguimiento, dado el esfuerzo para comprender los scripts y Ruby, etc., y el rendimiento probable, tomé otra ruta y evité todos los límites escribiendo directamente en la base de datos usando SQL. De esta manera, pude obtener varios miles de inserciones por segundo.

Había un tema preguntando qué tablas se requerían, ahora está cerrado, así que respondo aquí que cambié las siguientes tablas para insertar los usuarios:

user_avatars
user_emails
user_profiles
user_search_data
user_stats
users
1 me gusta