2013-05-03 40 views
24

Tôi có một ứng dụng liên quan đến việc gửi Thông báo đẩy của Apple đến ~ 1 triệu người dùng theo định kỳ. Các thiết lập để làm như vậy đã được xây dựng và thử nghiệm cho số lượng nhỏ các thông báo. Vì không có cách nào tôi có thể thử nghiệm gửi ở quy mô đó, tôi quan tâm đến việc biết liệu có bất kỳ gotchas trong việc gửi thông báo đẩy hàng loạt. Tôi có các kịch bản được viết bằng Python mở một kết nối đến máy chủ đẩy và gửi tất cả các thông báo qua kết nối đó. Apple khuyến cáo giữ nó mở càng lâu càng tốt. Nhưng tôi cũng thấy rằng kết nối chấm dứt và bạn cần phải thiết lập lại nó.Thông báo Đẩy của Apple với số lượng lớn

Tất cả trong tất cả, nó là disconcerting rằng gửi thành công không được công nhận, chỉ có những sai lầm được gắn cờ. Từ quan điểm của lập trình viên thay vì chỉ đơn giản là kiểm tra một điều "nếu (thành công)", bạn cần xem nhiều thứ có thể sai.

Câu hỏi của tôi là: Bộ lỗi thông thường mà bạn cần xem là gì để đảm bảo thư của bạn không biến mất âm thầm thành lãng quên? Việc đóng kết nối là một kết nối dễ dàng. Có người khác không?

+0

bạn có tìm cách gửi thông báo đẩy hàng loạt cho iphone không? bởi vì tôi không tìm thấy bất kỳ:/ –

+0

Nếu bạn chỉ mới bắt đầu, hãy cân nhắc bắt đầu với Urban Airship, cung cấp cho bạn ~ 1 triệu lượt miễn phí mỗi tháng, nhưng nếu không thì sẽ cực kỳ tốn kém. Nếu bạn có khối lượng nhiều hơn thế, thì bạn có thể sử dụng dịch vụ SNS của Amazon (đó là một vài đơn đặt hàng có độ lớn rẻ hơn Urban Airship, và là những gì tôi sử dụng). – er0

+0

nhưng tôi đang gửi push của tôi từ miễn phí vì vậy phải có một cách để gửi đẩy số lượng lớn cũng miễn phí –

Trả lời

13

Tôi hoàn toàn đồng ý với bạn rằng API này rất bực bội và nếu họ đã gửi phản hồi cho từng thông báo thì việc triển khai sẽ dễ dàng hơn nhiều.

Điều đó nói rằng, đây là những gì của Apple nói rằng bạn nên làm (từ Technical Note):

Push Notification Throughput and Error Checking

There are no caps or batch size limits for using APNs. The iOS 6.1 press release stated that APNs has sent over 4 trillion push notifications since it was established. It was announced at WWDC 2012 that APNs is sending 7 billion notifications daily.

If you're seeing throughput lower than 9,000 notifications per second, your server might benefit from improved error handling logic.

Here's how to check for errors when using the enhanced binary interface. Keep writing until a write fails. If the stream is ready for writing again, resend the notification and keep going. If the stream isn't ready for writing, see if the stream is available for reading.

If it is, read everything available from the stream. If you get zero bytes back, the connection was closed because of an error such as an invalid command byte or other parsing error. If you get six bytes back, that's an error response that you can check for the response code and the ID of the notification that caused the error. You'll need to send every notification following that one again.

Once everything has been sent, do one last check for an error response.

It can take a while for the dropped connection to make its way from APNs back to your server just because of normal latency. It's possible to send over 500 notifications before a write fails because of the connection being dropped. Around 1,700 notifications writes can fail just because the pipe is full, so just retry in that case once the stream is ready for writing again.

Now, here's where the tradeoffs get interesting. You can check for an error response after every write, and you'll catch the error right away. But this causes a huge increase in the time it takes to send a batch of notifications.

Device tokens should almost all be valid if you've captured them correctly and you're sending them to the correct environment. So it makes sense to optimize assuming failures will be rare. You'll get way better performance if you wait for write to fail or the batch to complete before checking for an error response, even counting the time to send the dropped notifications again.

None of this is really specific to APNs, it applies to most socket-level programming.

If your development tool of choice supports multiple threads or interprocess communication, you could have a thread or process waiting for an error response all the time and let the main sending thread or process know when it should give up and retry.

+0

Wow. Đây không phải là lần đầu tiên tôi tìm thấy nhiều thông tin và câu trả lời trong Apple Tech Note mà tôi không biết. Cảm ơn con trỏ! – er0

+0

Bạn được chào đón. Ghi chú kỹ thuật này đã được khoảng một thời gian, nhưng họ đã thêm phần tôi trích dẫn gần đây. – Eran

+0

@Eran, tôi nhận được lỗi đường ống bị hỏng trong khi gửi thông báo đẩy hàng loạt, tôi đang sử dụng django-python để gửi thông báo, làm cách nào tôi có thể tránh lỗi đường ống bị hỏng? Tôi đang làm việc lần đầu tiên về loại dự án này vì vậy tôi không nhận thức được với rất nhiều điều, xin đề nghị cách thích hợp để tránh những lỗi này. – MegaBytes

6

Chỉ muốn kêu vang trong với một góc nhìn ngôi thứ nhất, như chúng tôi gửi hàng triệu thông báo APNS mỗi ngày.

Tham chiếu @Eran trích dẫn không may về nguồn tài nguyên tốt nhất mà chúng tôi có cho cách Apple quản lý ổ cắm APNS. Đó là tốt cho khối lượng thấp, nhưng tài liệu của Apple tổng thể là rất sai lệch đối với các nhà phát triển khối lượng bình thường, thấp. Bạn sẽ thấy nhiều hành vi không có giấy tờ khi bạn mở rộng quy mô.

Phần tài liệu đó về phát hiện lỗi không đồng bộ là rất quan trọng đối với thông lượng cao. Nếu bạn nhấn mạnh vào việc chặn các lỗi trên mỗi lần gửi, thì bạn sẽ cần phải phối hợp chặt chẽ với công nhân của mình để duy trì thông lượng. Cách được đề nghị, tuy nhiên, là chỉ cần gửi nhanh như bạn có thể gửi, và bất cứ khi nào bạn nhận được và lỗi: sửa chữa và phát lại.

Phần bài mà tôi mất ngoại lệ là:

Device tokens should almost all be valid if you've captured them correctly and you're sending them to the correct environment. So it makes sense to optimize assuming failures will be rare.

Để predicate lời khuyên rằng với một lớn như vậy "NẾU" dường như vô cùng sai lầm. Tôi gần như có thể đảm bảo rằng hầu hết các nhà phát triển không nắm bắt thẻ và xử lý dịch vụ phản hồi của Apple 100% "chính xác". Ngay cả khi họ đã có, hệ thống vốn đã mất mát, vì vậy trôi dạt sẽ xảy ra.

Chúng tôi thấy số khác không phải là lỗi # 8 phản hồi (mã thông báo thiết bị không hợp lệ) mà tôi gán cho điện thoại, lỗi máy khách hoặc người dùng cố ý giả mạo mã thông báo của họ cho chúng tôi. Chúng tôi cũng đã thấy một số lỗi # 7 (kích thước tải trọng không hợp lệ) trong quá khứ, mà chúng tôi đã theo dõi xuống các thông điệp được mã hóa không đúng cách mà nhà phát triển đã thêm vào cuối của chúng tôi. Đó là lỗi của chúng tôi tất nhiên, nhưng đó là quan điểm của tôi - nói rằng "tối ưu hóa thất bại giả định sẽ rất hiếm" là thông điệp sai để gửi cho các nhà phát triển học tập. Những gì tôi có thể nói thay vào đó sẽ là:

Assume errors will happen.

Hope that they happen infrequently, but code defensively in case they don't.

Nếu bạn tối ưu hóa giả lỗi sẽ hiếm, bạn có thể đặt cơ sở hạ tầng của bạn có nguy cơ bị bất cứ khi nào dịch vụ APNS đi xuống và mỗi tin nhắn bạn gửi trở lại một lỗi # 10.

Sự cố xảy ra khi cố gắng tìm ra cách trả lời đúng các lỗi. Tài liệu không rõ ràng hoặc vắng mặt về cách xử lý và khôi phục đúng cách từ các lỗi khác nhau. Điều này được để lại như một bài tập cho người đọc rõ ràng.

Các vấn đề liên quan