Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
ある日突然、Laravel Queue Workerが壊れた
kubotak
March 28, 2021
Programming
2
390
ある日突然、Laravel Queue Workerが壊れた
PHPerKaigi 2021 LT
kubotak
March 28, 2021
Tweet
Share
More Decks by kubotak
See All by kubotak
Felteで作る簡単フォームバリデーション
kubotak
1
150
SvelteKitを本番投入してみて
kubotak
0
540
PlaywrightによるSvelteコンポーネントテスト
kubotak
0
1.1k
AWS CDKでまるっと インフラ環境をIaCしたぞ!
kubotak
0
79
FeatureToggle戦略と運用方法
kubotak
3
790
SvelteKitでストアのハイドレーションを考えてみた
kubotak
2
100
PHPコードを消すライブラリを作った
kubotak
0
1.1k
なぜLaravel9はLTSではないのか
kubotak
0
940
Nuxt v2からv3へのマイグレーション
kubotak
0
530
Other Decks in Programming
See All in Programming
SwiftPMのPlugin入門 / introduction_to_swiftpm_plugin
uhooi
2
100
Swift Observation
shiz
4
290
爆速の日経電子版開発の今
shinyaigeek
2
620
Step Functions Distributed Map を使ってみた
codemountains
0
110
Workshop on Jetpack compose
aldefy
0
140
Use KMM to call the API of the National Tax Agency
akkeylab
0
300
What's new in Shopware 6.5
shyim
0
110
Spring BootとKubernetesで実現する今どきのDevOps入門
xblood
0
350
AWSとCPUのムフフな関係
cmdemura
0
470
Azure Functionsをサクッと開発、サクッとデプロイ/vscodeconf2023-baba
nina01
1
340
ITエンジニア特化型Q&Aサイトteratailを 言語、DB、クラウドなど フルリプレイスした話
leveragestech
0
410
Hatena Engineer Seminar #23「新卒研修で気軽に『ありがとう』を伝え合える Slack アプリを開発した話」
slashnephy
0
300
Featured
See All Featured
Designing for Performance
lara
600
65k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
13
1.1k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
182
15k
Become a Pro
speakerdeck
PRO
6
3.2k
Large-scale JavaScript Application Architecture
addyosmani
499
110k
What's in a price? How to price your products and services
michaelherold
233
9.7k
The MySQL Ecosystem @ GitHub 2015
samlambert
240
11k
A Tale of Four Properties
chriscoyier
149
21k
Robots, Beer and Maslow
schacon
154
7.3k
How GitHub Uses GitHub to Build GitHub
holman
465
280k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
31
20k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
22
1.7k
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 :)