如何在处理速率限制时异步发送 HTTP 请求?
How can I send HTTP Requests asynchronously while handling rate-limits?
免责声明:我是 sttp and Monix 的新手,这是我尝试了解更多有关这些库的信息。我的目标是通过 HTTP GET 请求从给定的 API 获取数据(客户端)-> 解析 JSON 响应 -> 将此信息写入数据库。我的问题仅与第一部分有关。我的 objective 是 运行 以异步(希望快)的方式获取请求,同时有办法避免或处理速率限制。
下面是我已经尝试过的片段,似乎适用于单个请求:
package com.github.client
import io.circe.{Decoder, HCursor}
import sttp.client._
import sttp.client.circe._
import sttp.client.asynchttpclient.monix._
import monix.eval.Task
object SO extends App {
case class Bla(paging: Int)
implicit val dataDecoder: Decoder[Bla] = (hCursor: HCursor) => {
for {
next_page <- hCursor.downField("foo").downArray.downField("bar").as[Int]
} yield Bla(next_page)
}
val postTask = AsyncHttpClientMonixBackend().flatMap { implicit backend =>
val r = basicRequest
.get(uri"https://foo.bar.io/v1/baz")
.header("accept", "application/json")
.header("Authorization", "hushh!")
.response(asJson[Bla])
r.send() // How can I instead of operating on a single request, operate on multiple
.flatMap { response =>
Task(response.body)
}
.guarantee(backend.close())
}
import monix.execution.Scheduler.Implicits.global
postTask.runSyncUnsafe() match {
case Left(error) => println(s"Error when executing request: $error")
case Right(data) => println(data)
}
}
我的问题:
- 我如何通过使用 Monix 操作多个 GET 请求(而不是单个请求),同时保持代码异步和可组合
- 如何避免或处理达到 api 服务器施加的速率限制
附带说明一下,如果支持速率限制,我也可以灵活使用另一个后端 objective。
你可以这样使用monix.reactive.Observable
Observable.repeatEval(postTask) // we generate infinite observable of the task
.throttle(1.second, 3) // set throttling
.mapParallelOrderedF(2)(_.runToFuture) // set execution parallelism and execute tasks
.subscribe() // start the pipline
while (true) {}
免责声明:我是 sttp and Monix 的新手,这是我尝试了解更多有关这些库的信息。我的目标是通过 HTTP GET 请求从给定的 API 获取数据(客户端)-> 解析 JSON 响应 -> 将此信息写入数据库。我的问题仅与第一部分有关。我的 objective 是 运行 以异步(希望快)的方式获取请求,同时有办法避免或处理速率限制。
下面是我已经尝试过的片段,似乎适用于单个请求:
package com.github.client
import io.circe.{Decoder, HCursor}
import sttp.client._
import sttp.client.circe._
import sttp.client.asynchttpclient.monix._
import monix.eval.Task
object SO extends App {
case class Bla(paging: Int)
implicit val dataDecoder: Decoder[Bla] = (hCursor: HCursor) => {
for {
next_page <- hCursor.downField("foo").downArray.downField("bar").as[Int]
} yield Bla(next_page)
}
val postTask = AsyncHttpClientMonixBackend().flatMap { implicit backend =>
val r = basicRequest
.get(uri"https://foo.bar.io/v1/baz")
.header("accept", "application/json")
.header("Authorization", "hushh!")
.response(asJson[Bla])
r.send() // How can I instead of operating on a single request, operate on multiple
.flatMap { response =>
Task(response.body)
}
.guarantee(backend.close())
}
import monix.execution.Scheduler.Implicits.global
postTask.runSyncUnsafe() match {
case Left(error) => println(s"Error when executing request: $error")
case Right(data) => println(data)
}
}
我的问题:
- 我如何通过使用 Monix 操作多个 GET 请求(而不是单个请求),同时保持代码异步和可组合
- 如何避免或处理达到 api 服务器施加的速率限制
附带说明一下,如果支持速率限制,我也可以灵活使用另一个后端 objective。
你可以这样使用monix.reactive.Observable
Observable.repeatEval(postTask) // we generate infinite observable of the task
.throttle(1.second, 3) // set throttling
.mapParallelOrderedF(2)(_.runToFuture) // set execution parallelism and execute tasks
.subscribe() // start the pipline
while (true) {}