Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ある日突然、Laravel Queue Workerが壊れた
Search
kubotak
March 28, 2021
Programming
1.1k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ある日突然、Laravel Queue Workerが壊れた
PHPerKaigi 2021 LT
kubotak
March 28, 2021
More Decks by kubotak
See All by kubotak
ハーネスエンジニアリング白書
kubotak
0
77
Laravelにはdeleted_atがありますけど?
kubotak
2
110
PHPでWebSocketサーバーを実装しよう2025
kubotak
0
2.2k
情報漏洩させないための設計
kubotak
6
3.1k
Svelteコンポーネントの依存関係に秩序を〜
kubotak
0
240
DMARCレポート可視化ツールを SvelteKitで作った話
kubotak
2
680
Superforms本番投入で分かった良さとハマりどころ
kubotak
0
1.1k
Storybookを書くだけでリグレッションテストが 実行される世界へようこそ
kubotak
31
12k
(うまくいった||いかなかった) 技術選定は何を考えていたか
kubotak
1
1.5k
Other Decks in Programming
See All in Programming
自作OSでスライド発表する
uyuki234
1
4k
アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル
naoya
16
3.7k
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
110
5分で問診!Composer セキュリティ健康診断
codmoninc
0
680
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
550
関数型プログラミングのメリットって何だろう?
wanko_it
0
200
作るコストが小さくなった時代 幸せに働くために改めて考えたいこと 〜エンジニアとして価値を出し続けるために注視している二分野〜
yuppeeng
0
130
霧の中の代数的エフェクト
funnyycat
1
440
Terraform標準の組織で AWS CDKをどう使うか
mu7889yoon
1
400
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
250
AI時代、エンジニアはどう育つのか -未経験エンジニアの成長を間近で見て考えたこと-
thasu0123
0
190
Apache Hive: そしてCloud Native Lakehouseへ
okumin
1
180
Featured
See All Featured
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.5k
How GitHub (no longer) Works
holman
316
150k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
780
Embracing the Ebb and Flow
colly
88
5.1k
Designing Powerful Visuals for Engaging Learning
tmiket
1
460
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
390
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
440
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.7k
Are puppies a ranking factor?
jonoalderson
1
3.7k
Prompt Engineering for Job Search
mfonobong
0
380
4 Signs Your Business is Dying
shpigford
187
22k
Deep Space Network (abreviated)
tonyrice
0
240
Transcript
Copyright © M&A Cloud All rights reserved. ある日突然、 Laravel Queue
Workerが壊れた PHPerKaigi2021/LT Kenjiro Kubota
Copyright © M&A Cloud All rights reserved. Profile 2 久保田
賢二朗 kubotak-is kubotak_public kenjiro.kubota 株式会社M&Aクラウド JavaScript Go PHP https://kubotak.page
Copyright © M&A Cloud All rights reserved. 前提知識 前提知識 •
AWS ElasticBeanstalk(以降EB)のWebサーバーとWorkerサー バー上でLaravel Queuesを利用したJobを運用 • メッセージングシステムとしてAWS SQSを利用
Copyright © M&A Cloud All rights reserved. アーキテクチャ
Copyright © M&A Cloud All rights reserved. ある日突然、 Laravel Queue
Workerが壊れた
Copyright © M&A Cloud All rights reserved. 何もしてないのに壊れた • というわけではない。
• PHP7.2のEB環境からPHP7.4にアップグレード後 に死んだ • EB環境が変わったことでなぜ死んだかは不明 何もしてないのに壊れた
Copyright © M&A Cloud All rights reserved. なぜ死んだのか なぜ死んだのか •
LaravelのQueueはJobというクラスをPHPシリアライズした文字 列のメッセージキューでやり取りする • Workerではメッセージから取得した文字列をアンシリアライズ することでPHPのコードとして実行する • アンシリアライズが失敗
Copyright © M&A Cloud All rights reserved. なぜアンシリアライズが失敗するのか なぜアンシリアライズが失敗するのか 原因が不明だがシリアライズ前にスペースが2つ連続で含まれる文字
列が、メッセージキューから取得されたあとのメッセージではスペー スが1つに纏められている事象があった (SQSからEBWorkerがHTTPに変換する際)
Copyright © M&A Cloud All rights reserved. コードで説明 PHPシリアライズされた状態の文字列
Copyright © M&A Cloud All rights reserved. コードで説明 アンシリアライズするともとのインスタンスに戻る
Copyright © M&A Cloud All rights reserved. コードで説明 12345678910111213 型:値
Copyright © M&A Cloud All rights reserved. コードで説明 アンシリアライズに失敗するとfalseとなる 11
実際の文字数と異なる
Copyright © M&A Cloud All rights reserved. わけがわからない上に影響範囲が大きい 対応
Copyright © M&A Cloud All rights reserved. 「文字列全部Base64エンコードしちゃお」 対応
Copyright © M&A Cloud All rights reserved. Base64 Base64 Base64は、データを64種類の印字可能な英数字のみを用いて、それ以外の文字
を扱うことの出来ない通信環境にてマルチバイト文字やバイナリデータを扱う ためのエンコード方式である。 MIMEによって規定されていて、7ビットのデータしか扱うことの出来ない電子 メールにて広く利用されている。具体的には、A–Z, a–z, 0–9 までの62文字 と、記号2つ (+, /)、さらにパディング(余った部分を詰める)のための記号と して = が用いられる。 この変換によって、データ量は4/3(約133%)になる[1]。また、MIMEの基準 では76文字ごとに改行コードが入るため、この分の2バイトを計算に入れると データ量は約137%となる[2]。 出典: フリー百科事典『ウィキペディア(Wikipedia)』
Copyright © M&A Cloud All rights reserved. Base64 Base64 Base64は、データを64種類の印字可能な英数字のみを用いて、それ以外の文字
を扱うことの出来ない通信環境にてマルチバイト文字やバイナリデータを扱う ためのエンコード方式である。 MIMEによって規定されていて、7ビットのデータしか扱うことの出来ない電子 メールにて広く利用されている。具体的には、A–Z, a–z, 0–9 までの62文字 と、記号2つ (+, /)、さらにパディング(余った部分を詰める)のための記号と して = が用いられる。 この変換によって、データ量は4/3(約133%)になる[1]。また、MIMEの基準 では76文字ごとに改行コードが入るため、この分の2バイトを計算に入れると データ量は約137%となる[2]。 出典: フリー百科事典『ウィキペディア(Wikipedia)』 スペース撲滅
Copyright © M&A Cloud All rights reserved. __serialize/__unserializeを利用 __serialize/__unserializeを利用 •
PHP7.4から追加されたマジックメソッドの __serialize/__unserializeを利用 • 幸いにも弊社アプリケーションでは文字列をプリミティブではな くStringValue型という独自クラスで定義していたので、このク ラスに対してマジックメソッドを追加 ※7.4以前なら__sleep/__wakeupが代用できる
Copyright © M&A Cloud All rights reserved. __serialize/__unserializeを利用
Copyright © M&A Cloud All rights reserved. __serialize/__unserializeを利用
Copyright © M&A Cloud All rights reserved.
Copyright © M&A Cloud All rights reserved. まとめ まとめ •
メッセージングシステムを利用するときはPHPシリアライズの文字 列ではなくJSON形式のような汎用的な形式が良いと思う! ◦ とはいえスペースが消えちゃうのはよくわからん • プリミティブな値ではなくラッパーした型を使っているとこういう ケースで助かるぞ! • マジックメソッドありがとう!
Copyright © M&A Cloud All rights reserved. Thank you for
watching :)