4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Akkaによるbatch request作り方

Posted at

Background

以前投稿したakka-pusherではeventを1つずつ投げていたので、API Call数でプランが変わるpusherでは結構致命的です。

そこで、batch requestに対応しました。

対応PR: https://github.com/dtaniwaki/akka-pusher/pull/22

How to make the batch request

Akka Actorのschedulerを使いました。
まずSchedule TaskをActorで受け取るためのcase classを作成します。

case class BatchTriggerTick()

そして、schedulerを使ってBatchTriggerTickを自分自身に一定間隔で投げます。

class PusherActor(config: Config = ConfigFactory.load()) extends Actor {
  // ...

  system.scheduler.schedule(
    1000 milliseconds,
    1000 milliseconds,
    self,
    BatchTriggerTick()))

  // ...
}

本来はbatch modeでない時にメッセージを送るためのTriggerMessageをbatch modeでも使い回したかったのですが、pusher側で複数指定できるchannelsではなく個別指定のchannelを使わなければならないという制限があるため、別途BatchTriggerMessageを使用します。

そして、BatchTriggerMessageを受け取った時は送信せずにキューに貯め、BatchTriggerTickを受け取った時にキューにあるメッセージをまとめてpusherに投げるようにしました。

class PusherActor(config: Config = ConfigFactory.load()) extends Actor {
  // ...

  protected val batchTriggerQueue = Queue[BatchTriggerMessage]()

  override def receive: Receive = {
    case trigger: BatchTriggerMessage =>
      batchTriggerQueue.enqueue(trigger)
      true
    case BatchTriggerTick() =>
      val triggers = batchTriggerQueue.dequeueAll { _ => true }
      triggers.grouped(batchNumber) foreach { triggers =>
        pusher.trigger(triggers.map(BatchTriggerMessage.unapply(_).get)).map {
          case Success(_) => // Do Nothing
          case Failure(e) => logger.warn(e.getMessage)
        }
      }
      triggers.length
  }

  // ...
}

pusherの受け付けるevent数が最大100なので、100ずつに区切っています。

実際に動くものをheroku上に作ってみました。

これを使ってチャットアプリのバックエンドが簡単に作れるようになりました。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?