Symfony 4 + ECCUBE, làm thế nào để luân chuyển query giữa các node master slave

Tram Ho

Mở đầu

Hắn nhiều người trong chúng ta có biết qua master slave node trong RDS , mặc định các framework PHP nổi tiếng như PHP , Symfony đều có hỗ trợ config master slave endpoint, để việc luân chuyển query được hiệu quả, các query WRITE sẽ được chuyển qua node WRITE, các query READ (SELECT) sẽ được chuyển qua node READ.

Vấn đề.

Và đây chính là lúc vấn đề bắt đầu. ECCUBE được viết dựa trên symfony 4, nhưng lại custom theo kiểu:

Tất cả request được wrap trong 1 câu transaction của query DB, dù request đó chỉ toàn query READ

src/Eccube/EventListener/TransactionListener.php

Và rồi câu chuyện lại đi xa hơn 🥲🥲🥲 , đối với doctrine2 (thư viện query được dùng trong Symfony ECCUBE, một ORM library tương tự Eloquent của Laravel), các query được viết trong 1 transaction default sẽ được chuyển sang node WRITE (vì nó coi đây là 1 query sắp có ghi). TOANG !!!!

Giải pháp

Ở đây ta cần custom lại class connection 1 chút, tạo 1 file CustomMasterSlaveConnection.php kế thừa MasterSlaveConnection, điểm quan trọng ở đây là method connect(). Chúng được override method connect chọn node WRITE READ phù hợp, implement thêm 1 cờ để lock, trong TH này ta có thể force cho câu query đó chạy trên NODE nào luôn cũng dc.

Cách dùng thì khá dễ, chỉ cần lock() ở đầu phân đoạn bạn muốn dùng node READ, sau khi xong dùng hàm unlock() là dc

Kết

Hy vọng trên đây là 1 giải pháp giúp bạn có thể custom framework ECCUBE lựa chọn node READ WRITE phù hợp để đáp ứng khả năng chịu tải của hệ thống.

Tks for reading !!!

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo