概要
タスクキューを操作する時に、特定の処理が他の処理よりも先に実行できるよう優先順位を付けたいケースがあります。
RedisのBLPOPは複数のリストを処理してくれるのでそれを実現できます。
前提
以下の優先度を決めたキューがあるとします。
キュー名 | 優先度 | 入ってるタスク |
---|---|---|
queue:high | 高 | ht1, ht2, ht3 |
queue:middle | 中 | mt1, mt2, mt3 |
queue:low | 低 | lt1, lt2, lt3 |
タスクキューを操作する時に、特定の処理が他の処理よりも先に実行できるよう優先順位を付けたいケースがあります。
RedisのBLPOPは複数のリストを処理してくれるのでそれを実現できます。
以下の優先度を決めたキューがあるとします。
キュー名 | 優先度 | 入ってるタスク |
---|---|---|
queue:high | 高 | ht1, ht2, ht3 |
queue:middle | 中 | mt1, mt2, mt3 |
queue:low | 低 | lt1, lt2, lt3 |
Stripeの定期購読を使っていると、各ユーザの定期購読の更新タイミングでWebhook eventがちゃんと飛んできます。
ほぼリアルタイムで届くのでこのwebhookを使う側としては非常に助かる機能ですが、提供する立場から考えるとどうやるんだろう?と悩んだので幾つか自分でケースを考えてみました。
今回やりたいことを実現する上で問題になるのは主に以下です。
cronのようなスケジューラだと、今回のような個々のデータに対するスケジューリングはできません。
またバッチ処理で扱おうとすると、データ量が増えた時に処理対象がどんどん増えるため、対象の抽出や処理自体に時間がかかって実行頻度を上げることが難しくなります。
浮かんだのは以下の4つでした。
IAMグループのポリシーをちゃんと役割に分けて管理しようという話です。
admin, developer, operatorの3つの役割で分け、各グループに適切な権限を与えるようにします。
ただし
は各IAMユーザができるようにします。
グループ | 権限 |
---|---|
admin | AdministratorAccess |
developer | PowerUserAccess IAMUserChangePassword AllowUsersToUseMFA |
operator | ReadOnlyAccess IAMUserChangePassword AllowUsersToUseMFA |
インスタンスのヘルスチェックに失敗したり、リクエストが届かなかったりするケースの調査のためにネットワークの疎通を確認する機会は多々あります。
今回はその中でよく使うコマンドをまとめてみました。
pingはICMPのエコー要求/応答機能を使った診断コマンドです。
$ ping google.com PING google.com (216.58.200.206): 56 data bytes 64 bytes from 216.58.200.206: icmp_seq=0 ttl=54 time=2.329 ms 64 bytes from 216.58.200.206: icmp_seq=1 ttl=54 time=2.744 ms
ちなみにICMPはL3のプロトコルなのでポートは関係ありません。
続きを読む以前ECSの記事を幾つか書きましたが、
TerraformでECS環境の構築 - Carpe Diem
TerraformでECS環境の構築【オートスケール編】 - Carpe Diem
当時のECSは1インスタンス1コンテナにしないとポートが競合して同じ種類のコンテナを載せることはできませんでした。
しかし今ではALBが導入され、動的ポートマッピングといってコンテナ側のポートは80で、ホスト側にマッピングする際は動的に変えてよろしくやってくれる。ALBはその動的なポートに紐づくという機能が付いています。
これによって1インスタンスに同じ種類のコンテナがいくつもたてられるようになりました。
今回のコードはこちら
続きを読むgoroutineを使った時のpanicのハンドリングについて調べてみたのでまとめ。
Goはgoroutineで簡単に並列処理を書けますが、エラーハンドリングをきちんとしていないと後で困ることになるという話です。
recoverがどうなるか確認します。
func main() { fmt.Println("Calling f.") f() fmt.Println("Returned normally from f.") } func f() { defer func() { if r := recover(); r != nil { fmt.Println("Recovered in f", r) } }() panic("panic") }続きを読む