Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
ノイジーネイバー問題を解決する 公平なキューイング
Search
Shoichi Ochi
January 28, 2026
Programming
270
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ノイジーネイバー問題を解決する 公平なキューイング
Gotanda.rb#64の登壇資料です。
Shoichi Ochi
January 28, 2026
Transcript
40 slides
ノイジーネイバー問題を解決する 公平なキューイング Shoichi Ochi (@occhi) Gotanda.rb 2026-01-28
2 SmartBank, Inc. Software Engineer 越智 翔一 @ochi11181101
@sho-work おち しょういち 自己紹介
3
4 今回お話しするのは、 個人的にやっているシステム設計の勉強で学んだこと
5 「ノイジーネイバー問題」というワード、 時折聞きませんか?
6 ノイジーネイバー問題とは? ノイジーネイバー問題とは、マルチテナント環境 において、あるテナント(隣人 = ネイバー)のリ ソース使用が他のテナントのパフォーマンスに 悪影響を与える現象のこと。
長時間実行されるバックグラウンドジョブで問題 になりやすい。 (昨今トレンドになっている LLMを用いたプロダ クトでは問題になることが多い) 引用元①: https://densumesh.dev/blog/fair-queue/ 引用元②: https://zerofilter.medium.com/noisy-neighbor-problem-in-multi-tenant-systems-explained-briefly-3788ae5e9d5b
7 引用元: https://densumesh.dev/blog/fair-queue/ enqueueされたClient 3の処理が長時間dequeueされないケース
8 一般的な解決手段 ・ク ライアントのスロットリング ・公平なキューイング
9 クライアントのスロットリング
10 ク ライアントのスロットリング テナント毎に一定時間あたりに処理できるジョブ の数を制限する
11 引用元: https://github.com/Envek/sidekiq-fair_tenant sidekiqを使っている場合はsidekiq-fair_tenantというgemがある ク ライアントのスロットリング
12 あるテナントが先にかなりの数enqueueしていると、他のテナントが影響を受ける ク ライアントのスロットリング 課題
13 公平なキューイング
14 👎公平なキューイングなし 👍公平なキューイングあり 引用元: https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-fair-queues.html 公平なキューイング
15 今回は公平なキューイングの実現手段に焦点を当てます!
16 まずは公平なキューイングの処理の流れを考える🤔
17 右図のように、テナント毎にキューを分けて、 メッセージを管理する。 その上で、デキューの度にテナントを公平に選 択し、当該テナントのメッセージを取り出すよう にすれば実現できそう。 公平なキューイングの実現
18 右図のように、テナント毎にキューを分けて、 メッセージを管理する。 その上で、デキューの度にテナントを公平に選 択し、当該テナントのメッセージを取り出すよう にすれば実現できそう。 公平なキューイングの実現
19 テナント選択ロジックを考える🤔
20 テナント選択ロジック ・ラウンドロビン ・ランダムセレクション 引用元: https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-fair-queues.html 公平なキューイングの実現
21 ラウンドロビンの場合
22 ラウンドロビン ・ 厳密な「順番待ち行列」のイメージ (選択されると次は最後尾に追加される) 引用元:
https://www.qnx.com/developers/docs/8.0/com.qnx.doc.neutrino.sys_arch/topic/kernel_Round_robin_scheduling.html 公平なキューイングの実現
23 ・tenants.last_dequeued_at が古い順にテナントを選択する ・デキューの度に、
tenants.last_dequeued_atを更新する。 ラウンドロビンの場合の設計(RDBMSベース)
24 ・tenants.last_dequeued_at が古い順にテナントを選択する ・デキューの度に、
tenants.last_dequeued_atを更新する。 ラウンドロビンの場合の設計(RDBMSベース)
25 ・tenants.last_dequeued_at が古い順にテナントを選択する ・デキューの度に、tenants.last_dequeued_atを更新する
ラウンドロビンの場合の設計(RDBMSベース)
26 ・Redisでも実現できます。(ここでは割愛) ・broccoliというRustのライブラリが同じアルゴリズムで実現されています。 https://github.com/densumesh/broccoli ラウンドロビンの場合の設計(Redisベース)
引用元: https://densumesh.dev/blog/fair-queue/
27 ランダムセレクションの場合
28 ランダムセレクション その都度の「抽選箱」のイメージ 公平なキューイングの実現
29 ・ランダムにtenantsレコードを一件取得する ランダムセレクションの場合の設計(RDBMSベース)
30 ・ランダムにtenantsレコードを一件取得する 実はこのクエリ、テナントの数が少ないうちは高速だが、数が増えるとパフォーマンスが悪化する (indexが使えず、テーブルスキャンが発生するので、高コストなソートになる)
ランダムセレクションの場合の設計(RDBMSベース)
31 ・ランダムにtenantsレコードを一件取得する SQLアンチパターン 「16章 ランダムセレクション」が参考になります
☝ (時間の関係上、クエリの改善案は割愛) 引用元: https://www.oreilly.co.jp/books/9784814400744/ ランダムセレクションの場合の設計(RDBMSベース)
32 ・ランダムにtenantsレコードを一件取得する(改善 version) ランダムセレクションの場合の設計(RDBMSベース)
33 ランダムセレクションの場合の設計(Redisベース) ・ちなみにRedisベースでも実現できそう ・テナント選択時は SRANDMEMBER を使う ・メッセージは LPOP queue:tenant_202
で取得する ・テナントのメッセージが無くなったら SREM で、テナントIDを セットから削除
34 テナント選択ロジック ・ラウンドロビン ・ランダムセレクション 引用元: https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-fair-queues.html 公平なキューイングの実現
35 テナント選択ロジックの比較 公平なキューイングの実現
まとめ
37 まとめ ・ノイジーネイバー問題とは? ・解決する方法 ・スロットリング ・公平なキューイング ・公平なキューイングの実現手段 ・ラウンドロビン ・ランダムセレクション
38 オチ(occhiだけに!)
39 まとめ ベンダーロックインを気にしないなら、 SQS使った方が楽かな・・・
ノイジーネイバー問題を解決する 公平なキューイング Shoichi Ochi (@occhi) Gotanda.rb 2026-01-28
More Decks by Shoichi Ochi
See All by Shoichi Ochi
履歴が膨大なら、どう保存する? 〜Kaigi on Rails登壇後に深まったデータ設計の話〜
occhi
0
50
登壇はいいぞ! 〜Kaigi on Railsに登壇して起きた3つの変化〜
occhi
0
140
Railsで挑む大量データ永続化 〜600億件を永続化するための設計とボトルネックとの戦い〜
occhi
1
4.3k
Persisting Massive Data with Rails ~Designing for 60 billion rows, and fighting the bottlenecks~ Railsで挑む大量データ永続化 〜600億件を永続化するための設計とボトルネックとの戦い〜
occhi
0
840
Prevent Concurrency Problems! A Practical Introduction to Transactions
occhi
0
42
並行性の問題を防げ!実践トランザクション入門
occhi
1
370
高速化&コスト半減!? GitHub Actionsの サードパーティマネージドランナーの比較
occhi
1
1k
HTTPじゃ遅すぎる! SwitchBotを自作ハブで動かして学ぶBLE通信
occhi
0
2.4k
Other Decks in Programming
See All in Programming
Scalaの型でマルチテナントの認可を守る
nextbeatdev
0
120
SFCで実現する病院・医療システムの動的組み立て式UI
koukimiura
1
180
ローカルLLMの基本と近況 2611 / Local LLM basics and recent situation 2611
kishida
2
410
3回つくってわかった、 定期実行ジョブ基盤の本質情報
takai
4
3.9k
Next.js: The final boss of Web Performance
guaca
0
410
AI時代のIaC入門 〜なぜインフラをコードで管理したいのか?〜 / Introduction to IaC in the AI Era
akihisaikeda
6
1.5k
Railsのためのパスキー実践入門 〜マルチテナントSaaSでの意思決定〜
utakaha
4
4.4k
AI時代のFlutter品質設計 — アプリ品質を守るQuality Layers
omatty198
0
380
コード生成時代のAPI定義を支えるRequest Spec移行
pvcresin
0
130
エラーチャンネルのボールを拾い続けて鍛えるエンジニアの地力 / phpcon-niigata2026
meihei3
1
140
仕様駆動開発入門 (何を作るかを先に決めて渡す) | 目指せ Kiro マスター 05
inariku
PRO
2
160
社内AIエージェント「Askワンバン」における コストチューニングの取り組み
t0yohei
0
170
Featured
See All Featured
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
470
A Soul's Torment
seathinner
9
3.9k
Designing for humans not robots
tammielis
254
26k
Design in an AI World
tapps
1
390
What's in a price? How to price your products and services
michaelherold
247
13k
The Cult of Friendly URLs
andyhume
79
7.1k
Git: the NoSQL Database
bkeepers
PRO
433
67k
Code Review Best Practice
trishagee
74
20k
sira's awesome portfolio website redesign presentation
elsirapls
0
510
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.6k
Technical Leadership for Architectural Decision Making
baasie
4
650