SlideShare a Scribd company logo
JAVA 能做到的,
我大 PHP 也可以!
展開改寫線上服務之旅!
Harry
About Me
● Harry
● 104 Corp - Backend Engineer
● PHP, Laravel
● 爬山、拍照
Outline
● 為何需要替換 JAVA
● 該如何選擇框架及語言
● 上線服務不中斷
● Laravel 測試環境壓測數據
● Laravel Octane 壓測數據
● 壓測結果評估
● Laravel 線上數據
● 問題集錦
● 結論
為何需要替換 JAVA
● 非主流框架,可交流資訊較少
● 不像 Spring 很好的處理 Hibernate
等 DB 溝通程式
● 不像 Spring 妥善處理 DI
● 如同黑盒子一般,無法更改
● 不能 transaction
● 偶爾會突然拿不到資料
該如何選擇框架及語言
● 效能需能與原服務匹配
○ Request 數量
○ Latency
● 團隊能力
○ PHP
○ Laravel
● 維運成本 & 學習成本
考慮重點
Performance
Latency
最終決定
● 團隊成員熟悉PHP、Laravel
● 減少學習成本
● 公司其他團隊亦有使用Laravel 作為 API Server 的案例
● Laravel Octane 近乎無痛的升級
上線服務不中斷
確認架構可運行
DB
Request
批次翻寫 API
getAccount
getEmail
getName
getCellphone
getAddress
.
.
createAccount
updateAccount
deleteAccount
.
.
.
V1 V2
金絲雀部署
DB
getAccount 30%
getAccount 70%
Request
Laravel Octane 怎麼上?
DB
Request
Laravel 測試環境壓測數據
壓測環境及方式
● 機器規格
○ JAVA Karaf
■ Server = 1 / CPU = 2 core / RAM = 4GB
○ PHP Laravel
■ Server = 1 / CPU = 2 core / RAM = 4GB
● 壓測方式
○ Apache Benchmark
○ ab -c 100 -n 5000 http://{domain}/getAccount/{userid}
Server - CPU & Memory
DB - CPU
JAVA Laravel
DB - Questions
JAVA Laravel
DB - Preparement Connections
JAVA Laravel
Request 平均執行時間
Request 錯誤數量
完成所需的時間分佈 (越少越好)
Laravel Octane
測試環境壓測數據
Laravel Octane - Swoole
壓測環境及方式
● 機器同一台
○ Server = 1 / CPU = 2 core / RAM = 4GB
● 壓測對象
○ Worker = 1
○ Worker = 2 (default)
○ Worker = 4
○ Worker = 25 (Apache mpm)
● 壓測方式
○ Apache Benchmark
○ ab -c 100 -n 5000 http://{domain}/getAccount/{userid}
Server - CPU & Memory
Server - Worker CPU
Server - Memory
DB - CPU
Workers01 Workers02
Workers04 Workers25
DB - Questions
Workers01 Workers02
Workers04 Workers25
DB - Preparement Connections
Workers01 Workers02
Workers04 Workers25
Request 平均執行時間
完成所需的時間分佈 (越少越好)
壓測結果評估
平均執行時間
99% Requests 完成的時間
CPU Usage
Laravel 線上數據
線上環境及數據來源
● 機器規格
○ JAVA Karaf
■ Server 6台 / CPU 4 core / RAM 16GB
○ PHP Laravel
■ Server 4台 / CPU 8 core / RAM 8GB
● API 數據
○ GET /getAccount/{userid}
● 數據來源
○ PHP 的量約是 JAVA 的 2 倍
■ JAVA Karaf >> 20210413 1500~1600
■ PHP Laravel >> 20210802 1500~1600
Response Time大於特定時間的比較
問題集錦
資料處理問題
address
Old
address
New
1.舊資料表
cellphone=0
2.預設資料處理
null
編碼格式問題
Content-Type:
application/json;
charset=utf-8
1.Header : Content Type
u4f60u597d
2.Json Encode
你好
導流問題
/getAccount/{userid}
/getAccount/{userid}
/getAccounts
/getAccounts
套件衝突
imagick
gmagick
V.S
Conclusion
評估影響範疇
可行性測試
上線流程規劃
退版計畫
快一起清掉
改不動的服務吧!
~QA Time~
Ad

More Related Content

What's hot (20)

HAProxy
HAProxy HAProxy
HAProxy
Arindam Nayak
 
From Generator to Fiber the Road to Coroutine in PHP
From Generator to Fiber the Road to Coroutine in PHPFrom Generator to Fiber the Road to Coroutine in PHP
From Generator to Fiber the Road to Coroutine in PHP
Albert Chen
 
초보자를 위한 분산 캐시 이야기
초보자를 위한 분산 캐시 이야기초보자를 위한 분산 캐시 이야기
초보자를 위한 분산 캐시 이야기
OnGameServer
 
Laravel で API バージョニングを実装するなら
Laravel で API バージョニングを実装するならLaravel で API バージョニングを実装するなら
Laravel で API バージョニングを実装するなら
Shohei Okada
 
Using The Mysql Binary Log As A Change Stream
Using The Mysql Binary Log As A Change StreamUsing The Mysql Binary Log As A Change Stream
Using The Mysql Binary Log As A Change Stream
Luís Soares
 
Introduce of open swoole
Introduce of open swooleIntroduce of open swoole
Introduce of open swoole
Thanh Tai
 
Laravelの認証について
Laravelの認証についてLaravelの認証について
Laravelの認証について
Takeo Noda
 
HA Deployment Architecture with HAProxy and Keepalived
HA Deployment Architecture with HAProxy and KeepalivedHA Deployment Architecture with HAProxy and Keepalived
HA Deployment Architecture with HAProxy and Keepalived
Ganapathi Kandaswamy
 
StreamPaaSのご紹介
StreamPaaSのご紹介StreamPaaSのご紹介
StreamPaaSのご紹介
Yahoo!デベロッパーネットワーク
 
Event-Driven Messaging and Actions using Apache Flink and Apache NiFi
Event-Driven Messaging and Actions using Apache Flink and Apache NiFiEvent-Driven Messaging and Actions using Apache Flink and Apache NiFi
Event-Driven Messaging and Actions using Apache Flink and Apache NiFi
DataWorks Summit
 
Hadoop Security Today & Tomorrow with Apache Knox
Hadoop Security Today & Tomorrow with Apache KnoxHadoop Security Today & Tomorrow with Apache Knox
Hadoop Security Today & Tomorrow with Apache Knox
Vinay Shukla
 
Red Hat OpenStack 17 저자직강+스터디그룹_1주차
Red Hat OpenStack 17 저자직강+스터디그룹_1주차Red Hat OpenStack 17 저자직강+스터디그룹_1주차
Red Hat OpenStack 17 저자직강+스터디그룹_1주차
Nalee Jang
 
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とPHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
do_aki
 
PHPで並列処理する ライブラリを作った
PHPで並列処理する ライブラリを作ったPHPで並列処理する ライブラリを作った
PHPで並列処理する ライブラリを作った
Hironobu Saitoh
 
給你一個使用 Laravel 的理由
給你一個使用 Laravel 的理由給你一個使用 Laravel 的理由
給你一個使用 Laravel 的理由
Shengyou Fan
 
Nginx Internals
Nginx InternalsNginx Internals
Nginx Internals
Joshua Zhu
 
OFI libfabric Tutorial
OFI libfabric TutorialOFI libfabric Tutorial
OFI libfabric Tutorial
dgoodell
 
サーバーサイドでの非同期処理で色々やったよ
サーバーサイドでの非同期処理で色々やったよサーバーサイドでの非同期処理で色々やったよ
サーバーサイドでの非同期処理で色々やったよ
koji lin
 
.NET 7 家族新成員: Microsoft Orleans v7
.NET 7 家族新成員:Microsoft Orleans v7.NET 7 家族新成員:Microsoft Orleans v7
.NET 7 家族新成員: Microsoft Orleans v7
twMVC
 
Design pattern talk by Kaya Weers - 2024
Design pattern talk by Kaya Weers - 2024Design pattern talk by Kaya Weers - 2024
Design pattern talk by Kaya Weers - 2024
Kaya Weers
 
From Generator to Fiber the Road to Coroutine in PHP
From Generator to Fiber the Road to Coroutine in PHPFrom Generator to Fiber the Road to Coroutine in PHP
From Generator to Fiber the Road to Coroutine in PHP
Albert Chen
 
초보자를 위한 분산 캐시 이야기
초보자를 위한 분산 캐시 이야기초보자를 위한 분산 캐시 이야기
초보자를 위한 분산 캐시 이야기
OnGameServer
 
Laravel で API バージョニングを実装するなら
Laravel で API バージョニングを実装するならLaravel で API バージョニングを実装するなら
Laravel で API バージョニングを実装するなら
Shohei Okada
 
Using The Mysql Binary Log As A Change Stream
Using The Mysql Binary Log As A Change StreamUsing The Mysql Binary Log As A Change Stream
Using The Mysql Binary Log As A Change Stream
Luís Soares
 
Introduce of open swoole
Introduce of open swooleIntroduce of open swoole
Introduce of open swoole
Thanh Tai
 
Laravelの認証について
Laravelの認証についてLaravelの認証について
Laravelの認証について
Takeo Noda
 
HA Deployment Architecture with HAProxy and Keepalived
HA Deployment Architecture with HAProxy and KeepalivedHA Deployment Architecture with HAProxy and Keepalived
HA Deployment Architecture with HAProxy and Keepalived
Ganapathi Kandaswamy
 
Event-Driven Messaging and Actions using Apache Flink and Apache NiFi
Event-Driven Messaging and Actions using Apache Flink and Apache NiFiEvent-Driven Messaging and Actions using Apache Flink and Apache NiFi
Event-Driven Messaging and Actions using Apache Flink and Apache NiFi
DataWorks Summit
 
Hadoop Security Today & Tomorrow with Apache Knox
Hadoop Security Today & Tomorrow with Apache KnoxHadoop Security Today & Tomorrow with Apache Knox
Hadoop Security Today & Tomorrow with Apache Knox
Vinay Shukla
 
Red Hat OpenStack 17 저자직강+스터디그룹_1주차
Red Hat OpenStack 17 저자직강+스터디그룹_1주차Red Hat OpenStack 17 저자직강+스터디그룹_1주차
Red Hat OpenStack 17 저자직강+스터디그룹_1주차
Nalee Jang
 
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とPHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
do_aki
 
PHPで並列処理する ライブラリを作った
PHPで並列処理する ライブラリを作ったPHPで並列処理する ライブラリを作った
PHPで並列処理する ライブラリを作った
Hironobu Saitoh
 
給你一個使用 Laravel 的理由
給你一個使用 Laravel 的理由給你一個使用 Laravel 的理由
給你一個使用 Laravel 的理由
Shengyou Fan
 
Nginx Internals
Nginx InternalsNginx Internals
Nginx Internals
Joshua Zhu
 
OFI libfabric Tutorial
OFI libfabric TutorialOFI libfabric Tutorial
OFI libfabric Tutorial
dgoodell
 
サーバーサイドでの非同期処理で色々やったよ
サーバーサイドでの非同期処理で色々やったよサーバーサイドでの非同期処理で色々やったよ
サーバーサイドでの非同期処理で色々やったよ
koji lin
 
.NET 7 家族新成員: Microsoft Orleans v7
.NET 7 家族新成員:Microsoft Orleans v7.NET 7 家族新成員:Microsoft Orleans v7
.NET 7 家族新成員: Microsoft Orleans v7
twMVC
 
Design pattern talk by Kaya Weers - 2024
Design pattern talk by Kaya Weers - 2024Design pattern talk by Kaya Weers - 2024
Design pattern talk by Kaya Weers - 2024
Kaya Weers
 

Similar to 2021.laravelconf.tw.slides5 (6)

開發環境建置
開發環境建置開發環境建置
開發環境建置
Shengyou Fan
 
Laravel - 簡介與環境設定
Laravel - 簡介與環境設定Laravel - 簡介與環境設定
Laravel - 簡介與環境設定
Vincent Chi
 
LaravelConf Taiwan 2017 單頁面應用與前後端分離開發
LaravelConf Taiwan 2017 單頁面應用與前後端分離開發LaravelConf Taiwan 2017 單頁面應用與前後端分離開發
LaravelConf Taiwan 2017 單頁面應用與前後端分離開發
俊仁 陳
 
Laravel installfest 工作坊 投影片
Laravel installfest 工作坊 投影片Laravel installfest 工作坊 投影片
Laravel installfest 工作坊 投影片
Shengyou Fan
 
工作坊簡介
工作坊簡介工作坊簡介
工作坊簡介
Shengyou Fan
 
COSCUP 2016 Laravel 部署工作坊 - 生態圈介紹
COSCUP 2016 Laravel 部署工作坊 - 生態圈介紹COSCUP 2016 Laravel 部署工作坊 - 生態圈介紹
COSCUP 2016 Laravel 部署工作坊 - 生態圈介紹
Shengyou Fan
 
開發環境建置
開發環境建置開發環境建置
開發環境建置
Shengyou Fan
 
Laravel - 簡介與環境設定
Laravel - 簡介與環境設定Laravel - 簡介與環境設定
Laravel - 簡介與環境設定
Vincent Chi
 
LaravelConf Taiwan 2017 單頁面應用與前後端分離開發
LaravelConf Taiwan 2017 單頁面應用與前後端分離開發LaravelConf Taiwan 2017 單頁面應用與前後端分離開發
LaravelConf Taiwan 2017 單頁面應用與前後端分離開發
俊仁 陳
 
Laravel installfest 工作坊 投影片
Laravel installfest 工作坊 投影片Laravel installfest 工作坊 投影片
Laravel installfest 工作坊 投影片
Shengyou Fan
 
COSCUP 2016 Laravel 部署工作坊 - 生態圈介紹
COSCUP 2016 Laravel 部署工作坊 - 生態圈介紹COSCUP 2016 Laravel 部署工作坊 - 生態圈介紹
COSCUP 2016 Laravel 部署工作坊 - 生態圈介紹
Shengyou Fan
 
Ad

More from LiviaLiaoFontech (9)

2021laravelconftwslides12
2021laravelconftwslides122021laravelconftwslides12
2021laravelconftwslides12
LiviaLiaoFontech
 
2021laravelconftwslides11
2021laravelconftwslides112021laravelconftwslides11
2021laravelconftwslides11
LiviaLiaoFontech
 
2021laravelconftwslides10
2021laravelconftwslides102021laravelconftwslides10
2021laravelconftwslides10
LiviaLiaoFontech
 
2021laravelconftwslides9
2021laravelconftwslides92021laravelconftwslides9
2021laravelconftwslides9
LiviaLiaoFontech
 
2021laravelconftwslides8
2021laravelconftwslides82021laravelconftwslides8
2021laravelconftwslides8
LiviaLiaoFontech
 
2021laravelconftwslides6
2021laravelconftwslides62021laravelconftwslides6
2021laravelconftwslides6
LiviaLiaoFontech
 
2021laravelconftwslides4
2021laravelconftwslides42021laravelconftwslides4
2021laravelconftwslides4
LiviaLiaoFontech
 
2021.laravelconf.tw.slides3
2021.laravelconf.tw.slides32021.laravelconf.tw.slides3
2021.laravelconf.tw.slides3
LiviaLiaoFontech
 
2021.laravelconf.tw.slides2
2021.laravelconf.tw.slides22021.laravelconf.tw.slides2
2021.laravelconf.tw.slides2
LiviaLiaoFontech
 
Ad

2021.laravelconf.tw.slides5