Thuế Bắt tay

Việc tích hợp Magento của bạn có thể bị chậm do một chi phí mạng ẩn.

Tôi từng chạy một tiến trình xuất sản phẩm có kết nối với một API định giá. Một sản phẩm thì chạy rất nhanh. Nhưng toàn bộ danh mục thì mất rất nhiều thời gian. Cơ sở dữ liệu của tôi thì ở trạng thái rảnh rỗi. Công cụ profiler cho thấy vấn đề nằm ở mạng.

Mã nguồn đã khởi tạo một HTTP client mới bên trong một vòng lặp.

Trước khi bạn gửi dữ liệu qua HTTPS, máy của bạn phải thực hiện những công việc nặng nề. Nó thực hiện bắt tay TCP (TCP handshake) để mở một socket. Sau đó, nó thực hiện bắt tay TLS (TLS handshake) để trao đổi chứng chỉ và thương lượng khóa. Quá trình này mất nhiều lượt truyền tải qua lại (round trips).

Nếu bạn chỉ làm việc này một lần, chi phí là rất thấp. Nhưng nếu bạn làm việc này bên trong một vòng lặp gồm 40.000 sản phẩm, bạn sẽ phải trả chi phí đó 40.000 lần. Dữ liệu thực tế thì nhỏ, nhưng phần thiết lập mới là phần đắt đỏ.

Với PHP, đôi khi bạn có cảm giác nên khởi tạo một client rồi bỏ đi. Cách này hiệu quả cho một yêu cầu web đơn lẻ, nhưng sẽ thất bại trong các tiến trình chạy lâu (long-running processes).

Hãy tránh mô hình này trong các cron jobs, lệnh console, hoặc các message queue consumers:

Đoạn mã này mở một kết nối mới và thực hiện toàn bộ quá trình bắt tay cho mỗi sản phẩm.

Guzzle sẽ giữ các kết nối luôn mở nếu bạn sử dụng cùng một instance của client. Hãy đưa client ra ngoài vòng lặp của bạn:

  • $client = new \GuzzleHttp\Client(['base_uri' => 'https://api.example.com']);
  • foreach ($products as $product) {
  • $client->post('/sync', [...]);
  • }

Bây giờ, socket và phiên TLS sẽ được giữ mở. Bạn chỉ cần bắt tay một lần và truyền tải phần còn lại. Trong Magento, hãy inject một client đã được cấu hình thông qua constructor thay vì khởi tạo nó một cách thủ công.

Việc không làm điều này không chỉ gây ra độ trễ. Bạn có thể bị cạn kiệt các cổng outbound. Các kết nối đã đóng sẽ tích tụ trong trạng thái TIME_WAIT nhanh hơn mức hệ điều hành có thể thu hồi chúng. Dịch vụ của bạn sẽ ngừng mở các socket mới hoàn toàn.

Hãy kiểm tra mã nguồn của bạn để tìm lỗi này. Chạy lệnh sau trong terminal của bạn:

grep -rn "new .*Client(" app/code | grep -i http

Hãy tìm bất kỳ việc khởi tạo client mới nào nằm bên trong một vòng lặp. Hãy đưa client ra ngoài vòng lặp. Đây là một thay đổi chỉ mất một dòng code nhưng mang lại sự tăng tốc cực lớn cho các tiến trình đồng bộ lớn.

Source: https://dev.to/iamrobindhiman/the-handshake-tax-reuse-your-http-client-in-magento-integrations-3kk7