API调用的频度在什么地方设置啊?

api

(Luke Fan) #1

我通过API更新论坛内容。
结果收到了一条错误提示:
DiscourseApi::TooManyRequests: {“errors”=>[“You’ve performed this action too many times. Please wait 47秒 before trying again.”], “error_type”=>“rate_limit”, “extras”=>{“wait_seconds”=>47}}

这东西在什么地方调整啊?

以前的版本好像没有这种设置。


(Erick Guan) #2

API 还有 rate limit?用个管理员的 API key?


(Luke Fan) #3

是用管理员身份申请的api key。


(Erick Guan) #4

设置里有 max user api reqs per minute/day 可以改。如果用了 ratelimit 这个 template,可以加:

params:
  reqs_per_second: 12
  burst_per_second: 12
  reqs_per_minute: 200
  burst_per_minute: 100

(Luke Fan) #5

这个设置项目,没有找到啊。
至于那个template,还在研究。


(Erick Guan) #6

我的错,这个应该没有了。管理员的 API key 不应该被限制频率。在最新版本上能复现么?


(Luke Fan) #7

最新的版本,以前没这个问题。
是管理员的key。


(Erick Guan) #8

应该是 bug,你可以给一段示例代码么?我可以去报 bug


(Luke Fan) #9

我在discourse的服务器上,使用

sudo ./launcher enter app
irb

直接调用管理员的key,往服务器里面灌输内容。
然后就被报错了。没有找到任何设置的地方。

DiscourseApi::TooManyRequests: {"errors"=>["You’ve performed this action too many times. Please wait 45秒 before trying again."], "error_type"=>"rate_limit", "extras"=>{"wait_seconds"=>45}}
from /usr/local/lib/ruby/gems/2.4.0/gems/discourse_api-0.22.0/lib/discourse_api/client.rb:142:in `handle_error'
from /usr/local/lib/ruby/gems/2.4.0/gems/discourse_api-0.22.0/lib/discourse_api/client.rb:127:in `request'
from /usr/local/lib/ruby/gems/2.4.0/gems/discourse_api-0.22.0/lib/discourse_api/client.rb:74:in `get'
from /usr/local/lib/ruby/gems/2.4.0/gems/discourse_api-0.22.0/lib/discourse_api/api/search.rb:14:in `search'

调用的过程非常正常,是按照demo的样式直接调用的。


(Erick Guan) #10

我从这里推测不到你调用的是什么 endpoint 也不知道你操作的流程 :frowning:


(Luke Fan) #11

大概就是反复的调用这两个函数吧。

					discourse.create_topic(category: category,
						skip_validations: true, 
  						auto_track: false, 
  						title: e.attributes['title'], 
  						raw: desc)	
					topic = search_topic(e.attributes['title'])

这个循环大概跑了20几次,就跳出了。


(Erick Guan) #12

抱歉,我没法重现。我在 master1.discoursecn.org 里跑了一次,短时间内创建了100个主题。我用的是 admin api key 和 username。

discourse.create_topic(category: category,
		   		     skip_validations: true, 
  				     auto_track: false, 
  				     title: title+x.to_s, 
  				     raw: desc+x.to_s)	

(Luke Fan) #13

每次做完create之后,还会search确认一次。

        ts = discourse.search(title)
	    topic = {}
	    unless  ts["topics"] == nil 
	      if ts["topics"].count == 1
	        topic = discourse.topic ts["topics"][0]["id"]
	      else     
	        ts["topics"].each do |t|  
	          topic = discourse.topic t["id"] if t["title"] == title
	        end
	      end
	    end
	    topic

我每次需要将topic的id记录下来。下一次,有可能就需要做update了,而不是create。
是不是search的次数不能太多?
我看了一下,我每创建一个topic,需要做两次search。笨了一些,但是以前是可以跑的。
先要seach一次,确认topic没有被创建过,创建,然后再search一次,拿topic_id。


(Erick Guan) #14

我想你应该是要增加下频率限制 API调用的频度在什么地方设置啊?


(Luke Fan) #15

我在程序里面添加了一些sleep,倒是可以跑了。
把程序也调整了一下,尽量减少了调用次数。

requests在什么地方调整?是不是要去改那个 web.rate…template文件之后,重新做launcher rebuild?
调哪个值,调到多少合适?


(Erick Guan) #16

是的。我猜 restart 应该就够了,你可以试试。现在直接调到你需要的值吧。