Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

SendGrid cho PHP chậm. Các yêu cầu không chặn có khả thi không?

Để trả lời phần đầu tiên của câu hỏi của bạn: Có, bạn có thể thực hiện các yêu cầu không đồng bộ với PHP , và thậm chí bỏ qua phản hồi của dịch vụ. Tuy nhiên, như bạn nói một cách chính xác, đó không phải là một giải pháp tuyệt vời.

Yêu cầu không đồng bộ

Bài đăng blog tuyệt vời này về Yêu cầu không đồng bộ trong PHP theo Segment.io đi đến một số kết luận:

  • Bạn có thể mở ổ cắm và ghi vào ổ cắm đó , như được mô tả bởi Chủ đề tràn ngăn xếp này - Tuy nhiên, có vẻ như điều này đang thực sự bị chặn và khá chậm (300ms trong các thử nghiệm của họ).
  • Bạn có thể ghi vào tệp nhật ký và sau đó xử lý tệp đó theo cách khác (về cơ bản là một hàng đợi, như bạn mô tả) - Tuy nhiên, điều này yêu cầu một quá trình khác để đọc nhật ký và xử lý nó. Việc sử dụng hệ thống tệp có thể bị chậm và các tệp được chia sẻ có thể gây ra tất cả các loại sự cố.
  • Bạn có thể đưa ra một yêu cầu cURL - Tuy nhiên, điều này có nghĩa là bạn không chờ phản hồi, vì vậy nếu SendGrid (hoặc một số dịch vụ khác) phản hồi có lỗi, bạn không thể bắt lỗi và phản hồi.

Vùng đất ý kiến

Hiện chúng tôi đang đi vào vùng đất bán quan điểm , nhưng các hàng đợi như bạn mô tả (chẳng hạn như một mySQL với một công việc cron, hoặc một tệp văn bản hoặc một cái gì đó khác) có xu hướng rất dễ mở rộng vì bạn có thể ném công nhân vào hàng đợi nếu bạn cần nó xử lý nhanh hơn. Những thứ này có thể nằm ngoài hệ thống giao diện người dùng của bạn (và do đó không chia sẻ tài nguyên).

Hàng đợi

Với một hàng đợi, bạn sẽ có một dịch vụ riêng biệt sẽ chịu trách nhiệm gửi email bằng SendGrid (ví dụ:). Nó sẽ kéo các nhiệm vụ ra khỏi hàng đợi (ví dụ:"gửi email cho Nick") và sau đó thực thi trên đó.

Có một số cách để triển khai hàng đợi mà bạn có thể xử lý.

  • Bạn có thể viết của riêng bạn - Như bạn có vẻ muốn tiếp tục sử dụng PHP / mySQL, nếu bạn làm điều này, bạn sẽ cần phải tính đến một loạt các vấn đề xếp hàng và các trường hợp cạnh kỳ lạ. Tuy nhiên, bạn sẽ có quyền kiểm soát tuyệt đối và đối với một ứng dụng đơn giản, điều này có thể hoạt động.
  • Bạn có thể triển khai hàng đợi tác vụ tự lưu trữ - Cần tây có nghĩa là một hàng đợi tác vụ phân tán, øMQ (ZeroMQ) RabbitMQ cũng có thể được sử dụng làm Hàng đợi Tác vụ. Chúng có nghĩa là phải được phân phối nhanh chóng và đã có rất nhiều suy nghĩ về chúng. Bạn cần phải chuẩn chúng trong hệ thống của mình để xem chúng có tăng tốc hay không. Nó cũng có nghĩa là bạn phải tự tổ chức các phần bổ sung. Tuy nhiên, đây có thể là giải pháp nhanh nhất từ ​​quan điểm giao tiếp.
  • Bạn có thể chuyển mọi thứ sang hàng đợi tác vụ được lưu trữ - IronMQ Amazon SQS đều là các giải pháp được lưu trữ thú vị, có nghĩa là bạn sẽ không cần dành tài nguyên cho chúng, ngoài ra với IronWorkers (ví dụ) bạn có thể nhờ dịch vụ khác chăm sóc. Tuy nhiên, vì bạn đang cố gắng tối ưu hóa một yêu cầu đến một dịch vụ bên ngoài, đây có thể không phải là giải pháp trong trường hợp này.

Email xếp hàng

Về chủ đề xếp hàng đợi email (cụ thể là), đây là điều phổ biến đối với người gửi email. Giống như với mọi thứ khác, điều đó có nghĩa là bạn có thể có độ tin cậy tốt hơn (vì nếu một dịch vụ xuống dòng không thành công, bạn có thể giữ nó trong hàng đợi và thử lại).

Tuy nhiên, với email, có một số dịch vụ cụ thể để xếp hàng đợi các tin nhắn. Đây là Máy chủ SMTP. Về mặt lý thuyết, bạn có thể thiết lập một máy chủ như sendmail và sau đó đặt SendGrid làm "máy chủ thông minh" hoặc chuyển tiếp và yêu cầu máy chủ gửi đến SendGrid. Sau đó, nó xếp hàng và giải quyết các gián đoạn dịch vụ và gửi thư với một ít mã bổ sung. Tuy nhiên , Các máy chủ SMTP rất khó xử lý, ngay cả khi chúng chỉ là chuyển tiếp tin nhắn. Ngoài ra, SMTP thậm chí còn chậm hơn HTTP để thiết lập kết nối và do đó có thể không phải những gì bạn muốn, nhưng bạn nên biết.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sequelize:nhiều mệnh đề where

  2. Nhận dữ liệu giữa hai ngày trên MySQL

  3. MySQL:Không thể đặt tên cho bảng trong trường hợp Upper Camel (Pascal Case)

  4. mysql - chọn giờ trong ngày giờ và nhóm

  5. Dữ liệu Mysql vào một Bảng HTML được tạo kiểu