Gibt es eine Möglichkeit, den RateLimiter für eine kurzfristige Massenbefüllung durch den Administrator vorübergehend zu deaktivieren?

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 „Gefällt mir“

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 „Gefällt mir“

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 „Gefällt mir“

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

Haben Sie das herausgefunden? Das Ändern der YAML-Datei ist nicht ideal, da es einen Neuerstellungsprozess erfordert. Ich bin nicht vertraut genug mit Rails/Discourse, um herauszufinden, wie man es vorübergehend in der Konsole deaktiviert.

Was ist Ihr Anwendungsfall? Welches Problem versuchen Sie zu lösen, das durch Ratenbegrenzungen behindert wird?

Ich versuche, 60.000 Benutzer so schnell wie möglich über die API zu importieren, ohne einen Neuaufbau durchzuführen. Ich habe auch auf einer Testinstallation versucht, das ADMIN-API-Limit über YAML zu erhöhen, aber es schien nicht zu funktionieren, aber vielleicht habe ich etwas falsch gemacht. (Ich führe Importe im Container durch, sodass die HTTP-Drosselung nicht gelten sollte).

Das ist nicht sehr hilfreich, aber was ich tun würde, wäre, die Benutzer in Rails zu erstellen und nicht über die API. discourse/script/import_scripts/csv_importer.rb at main · discourse/discourse · GitHub könnte ein Anfang sein.

Aber Sie können in den Container gehen und /var/www/discourse/config/discourse.conf bearbeiten und diese Variablen dort setzen und dann ein sv restart unicorn (oder vielleicht sv reload unicorn) ausführen. Sie möchten wahrscheinlich etwas wie apt-get update; apt-get install -y vim tun, um einen Editor zu haben.

2 „Gefällt mir“

Seltsam. Wenn ich die Konfigurationsdatei ansehe, ist das neue Limit bereits gesetzt. Das YAML-Update hat also funktioniert:

max_admin_api_reqs_per_key_per_minute = '6000'

Aber es scheint nicht zu funktionieren. Es gibt immer noch eine Begrenzung von 60 pro Minute. Wenn ich Anfragen auf 60 pro Minute drossle, gehen die meisten durch, aber aufgrund von Jitter lösen einige immer noch den Ratenbegrenzer aus:

{'success': True, 'active': True, 'message': 'Ihr Konto ist aktiviert und einsatzbereit.', 'user_id': 3596}
{'success': False, 'message': 'Neue Registrierungen sind von Ihrer IP-Adresse nicht erlaubt (maximales Limit erreicht). Kontaktieren Sie einen Mitarbeiter.', 'errors': {'ip_address': ['Neue Registrierungen sind von Ihrer IP-Adresse nicht erlaubt (maximales Limit erreicht). Kontaktieren Sie einen Mitarbeiter.']}, 'values': {'name': None, 'username': 'asdfd', 'email': 'user@domain.com'}, 'is_developer': False}
{'success': True, 'active': True, 'message': 'Ihr Konto ist aktiviert und einsatzbereit.', 'user_id': 3597}

Ich frage mich, ob es ein Problem mit den Anführungszeichen ist?

Sie könnten SiteSettings.max_admin_api_reqs_per_key_per_minute überprüfen und sehen, ob es eine Ganzzahl ist.

1 „Gefällt mir“

in default_current_user_provider.rb (die einzige Datei, die ich gefunden habe, die auf diesen Wert zu verweisen schien, enthält:

limit = GlobalSetting.max_admin_api_reqs_per_minute.to_i

es scheint ihn also zu konvertieren. Ich habe sogar versucht, ihn durch eine Zahl im Code zu ersetzen.

1 „Gefällt mir“

Mist. Das habe ich befürchtet.

1 „Gefällt mir“

Ich glaube, es hängt mit einem anderen Limit zusammen: Ich denke, es ist das Limit für die maximale Anzahl von Registrierungen von einer IP-Adresse, das erreicht wird, aber ich verstehe nicht, warum es nach dem Erreichen dieses Limits nicht dauerhaft blockiert wird. Möglicherweise ein Fehler in diesem Spam-Limit?

Wenn all diese Nutzer dieselbe IP-Adresse haben, dann liegst du wahrscheinlich richtig. Ich denke, die Lösung ist, diese Einstellung zu ändern oder den Leuten gefälschte IP-Adressen wie 127.0.0.x zu geben (oder vielleicht IPv6 zu verwenden, um es einfacher zu machen?).

1 „Gefällt mir“

Ich glaube, es erkennt, wo die Anfrage gestellt wird (Host-Computer), aber ich kann es umgehen, indem ich einen TL2-Benutzer mit derselben IP-Adresse hinzufüge (oder das IP-Limit anpasse).

Die API des Nutzers ist jedoch sehr langsam.

Deshalb empfehle ich, es in Rails zu tun. Es wird wahrscheinlich etwa 500 pro Minute schaffen.

1 „Gefällt mir“

Ja, das werde ich versuchen. Aber mir ist nicht klar, wie ich das Skript ausführen soll, wohin ich es kopieren soll und wie ich es ausführen soll (sobald ich die CSV-Dateien an den richtigen Stellen platziert habe)?

Sie können sich einige der anderen Anleitungs-Themen für die anderen ansehen. Sie funktionieren fast alle gleich.

1 „Gefällt mir“

Als Nachtrag, angesichts des Aufwands, die Skripte und Ruby usw. zu verstehen, und der wahrscheinlichen Leistung, habe ich einen anderen Weg eingeschlagen und alle Limits umgangen, indem ich direkt mit SQL in die Datenbank geschrieben habe. Auf diese Weise konnte ich mehrere tausend Einfügungen pro Sekunde erzielen.

Es gab ein Thema, in dem gefragt wurde, welche Tabellen benötigt werden. Es ist jetzt geschlossen, daher antworte ich hier, dass ich die folgenden Tabellen geändert habe, um die Benutzer einzufügen:

user_avatars
user_emails
user_profiles
user_search_data
user_stats
users
1 „Gefällt mir“