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

trieu.dev.da

Nguyễn Thanh Triều
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
1682993105872.png

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 !!!!
1682993162171.png

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.
1682993257321.png
1682993291829.png

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
1682993310775.png
 
Bên trên