Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

2017 02-14 キュー実装に見る排他処理

910 views

Published on

キューは排他制御ができていないと簡単に死んでしまいます。

Published in: Technology
  • Be the first to comment

2017 02-14 キュー実装に見る排他処理

  1. 1. キュー実装に見る 排他処理 CodeIgniter Night 2 2017-02-14 @noldorinfo
  2. 2. 自己紹介 • 竹腰彰成(たけこしあきしげ) • Twitter: @noldorinfo • http://blog.noldor.info/ 2
  3. 3. 今日のテーマ • CodeIgniter4でキュー実装中です • 仕様変更や機能追加するならリリース前のいまのうち • レビュー的な意味でツッコミお願いします 3
  4. 4. キューとは Queue 4
  5. 5. キュー(Queue) • 先入れ先出し: First In First Out: FIFO • 対義語はスタック(Last In First Out) • ここテストに出ます(※基本情報技術者試験) 5 図はWikiPediaより https://ja.wikipedia.org/wiki/FIFO
  6. 6. キューの利用用途 • フレームワークの場合、メッセージキューイング用途に使う • 例) • メール送信のリクエストをため込む • PDF生成を別スレッドに処理させる • つまり相手の応答を待たずに次の処理に移るために使う • 何か重い処理をしたいが、今すぐでなくてよい • 一方でブラウザにはすぐに応答したい • キューに入れてしまおう 6 ※パンクするのでメッセージを溜め込んではいけません
  7. 7. 処理が異常終了してメッセージが消える 7 処理始めるのでキューからメッセージ消しますー Fatal Error!
  8. 8. メッセージを残すと二重処理 8 処理始めます、終わるまでメッセージ消しませんー 別のスレッドが同じメッセージ取り出しちゃった! 重い、終わらない……
  9. 9. そこで排他処理 9 処理始めます、作業中のマーキングしますー 次のメッセージをやるねー 重い、終わらない…… こんなライブラリがほしい!
  10. 10. キュー実装がhelp wantedに 10
  11. 11. リクエストされているキューの種類 • RabbitMQ • ググると利用事例が結構あるキューのミドルウェア • Local File • ミドルウェアなしでも動かしたいらしい • Local Database • Webサーバが複数でもRDBで実装できていればいいよね • Redis、Memcached • Webサーバが複数でもKVSで実装できていればいいよね 11
  12. 12. RabbitMQでの排他処理 • Message Acknowledgment (ACK) • RDBのトランザクションのようなもの • 作業中はセッションつなげっぱなし、終わったらACKを投げる • ACKが戻る前にセッションが切れたら異常終了とみなす • セッションにタイムアウトはないので重い処理もできる 12 メッセージ取得 終わったら知らせる セッション持ったまま処理
  13. 13. RDBでRabbitMQのマネはできない • RDBならトランザクションでやれば楽だよね! 異常時にはロールバックできるし! ⇒行ロック・テーブルロック持ちっぱなし問題発生 13 メッセージ取得 終わったらcommit セッション持ったまま処理 DBへの負荷が!
  14. 14. トランザクションを使わない排他処理 • UPDATEしてaffected rows > 0ならロックできた、とみなす • SQLが1行で済むのでアトミック性は確保できている • 異常終了は検知できないのでタイムアウト処理を作る必要あり 14
  15. 15. まだ確認できてないこと • Radis/Memcachedで同じようなことできるの? • 長時間セッション張っていいの? • FIFOできるの? • ググると実装はあるらしい • ローカルファイルで汎用実装だとflock()だよね…… • flock()は信用ならんイメージがある • mkdir()による代替実装って今どきやるのか? アドバイスください! 15
  16. 16. ご清聴ありがとうございました 16

×