Slide 1

Slide 1 text

© 2024 Loglass Inc. 0 © 2024 Loglass Inc. Asynqを使って、サクッ と非同期処理を実現する 宮本 淳志 2024.12.10

Slide 2

Slide 2 text

© 2024 Loglass Inc. 1 自己紹介 自動車整備士としてキャリアをスタートし、退職後カナダのバンクーバーへ渡航。その後、プログラ ミングを現地の学校で勉強した後に、機械学習エンジニアとして現地のスタートアップでエンジニア としてのキャリアをスタートさせる。 2年半カナダに滞在したのち、福岡へ移住。 福岡の受託開発会社でバックエンドエンジニアとして3年ほど勤務。バックエンド・フロント・インフ ラの経験を積む。 2024年10月に株式会社ログラスへクラウドエンジニアとして入社。 生成AI入門中 株式会社ログラス クラウドエンジニア 宮本 淳志 Atsushi Miyamoto

Slide 3

Slide 3 text

© 2024 Loglass Inc. 2

Slide 4

Slide 4 text

© 2024 Loglass Inc. 3 今日話すこと 1. 非同期処理の重要性 2. Asynqとは 3. Asynqを使った実装 4. AWS x Asynq 5. まとめ Agenda

Slide 5

Slide 5 text

© 2024 Loglass Inc. 4 以前、Goを使ってアプリケーション開発を行っており、その過程でAsynqを使用しました。 使い勝手が良かったので、今回はAsynqに関する知見を共有できればと思っています。 現在の職場ではAsynqを使用していないため、あくまで以前の経験に基づいたお話となりますので、その点をご了承くだ さい。 00|背景 背景

Slide 6

Slide 6 text

© 2024 Loglass Inc. 5 01 非同期処理の重要性

Slide 7

Slide 7 text

© 2024 Loglass Inc. 6 01|非同期処理の重要性 なぜ必要なのか 時間のかかる処理や外部サービスに繋げる処理を同期的に実行すると、レスポンスに時間がかかり、ユー ザーに影響がでるケースがある 非同期で処理を実施すると、処理の結果を待たずにレスポンスを分離して返すことが可能になるため、時間 のかかる処理でもユーザー体験を保つことができる 例: ● メール送信 ● ファイルアップロード etc.. ※参考: https://aws.amazon.com/jp/builders-flash/202206/master-asynchronous-execution-01/

Slide 8

Slide 8 text

© 2024 Loglass Inc. 7 02 Asynqとは

Slide 9

Slide 9 text

© 2024 Loglass Inc. 8 02|Asynqとは 特徴 タスクを非同期に処理する仕組みを実現するために、Workerを活用したキューイングや処理を行うOSSライ ブラリ 特徴: ● 実装がシンプル ● タスクの非同期処理に加え、スケジューリング処理も実装可能 ● WebUIを使って、モニタリング可能 ● Redisをバックエンドに指定する必要あり ● 継続的にメンテされている (最新のリリース約1ヶ月前) ○ 例 ■ https://github.com/benmanns/goworker (最新のリリース約6年前) ■ https://github.com/gocraft/work (最新のリリース約6年前) ※参考: https://github.com/hibiken/asynq

Slide 10

Slide 10 text

© 2024 Loglass Inc. 9 02|Asynqとは 処理イメージ 1. アプリケーション側からタスクをキュー(Redis)にエンキュー 2. Redisにタスクが積まれる 3. Worker側からRedisに対してポーリング 4. タスクを取得 5. Worker側で何かしらの処理を行う

Slide 11

Slide 11 text

© 2024 Loglass Inc. 10 03 Asynqを使った実装

Slide 12

Slide 12 text

© 2024 Loglass Inc. 11 例として、メール送信をバックグラウンドで処理するハンドラーの実装 03|Asynqを使った実装 Taskハンドラーの実装 ● タスクのタイプ定義 ○ 様々なタスクに対して、どの処理を実行するか内部 的に判断するために使用 ● タスクを作成する関数を定義 ○ ここで作成されたタスクが最終的にRedisにエン キューされる ● タスクの処理を行うハンドラーの実装 ○ 非同期で行わせたい処理 参考: https://github.com/hibiken/asynq

Slide 13

Slide 13 text

© 2024 Loglass Inc. 12 ● Redisへ接続 ● 先ほど定義した関数を呼び出して、タスク作成 ● Redisへエンキュー 03|Asynqを使った実装 Redisへエンキューする処理の実装 参考: https://github.com/hibiken/asynq

Slide 14

Slide 14 text

© 2024 Loglass Inc. 13 ● Redisへ接続 ○ Taskごとのプライオリティも指定可能 ■ https://github.com/hibiken/asynq/wiki/Queue-Pri ority#weighted-priority ● Taskタイプとハンドラのマッピング ○ タイプごとに行わせたい処理の紐付け ● Worker Server起動 03|Asynqを使った実装 Workerの実装 参考: https://github.com/hibiken/asynq

Slide 15

Slide 15 text

© 2024 Loglass Inc. 14 04 AWS x Asynq

Slide 16

Slide 16 text

© 2024 Loglass Inc. 15 ● 使用技術 ○ Golang ○ AWS ■ ECS on Fargate ■ ElastiCache 04|AWS x Asynq ECS x Asynq

Slide 17

Slide 17 text

© 2024 Loglass Inc. 16 05 まとめ

Slide 18

Slide 18 text

© 2024 Loglass Inc. 17 05|まとめ まとめ ● Asynq便利なので、サクッと非同期基盤を実装したいときにオススメ ● Golang最近触っていないので、キャッチアップしていきたい

Slide 19

Slide 19 text

© 2024 Loglass Inc. 18