Chúng tôi đang cố gắng để Nhà môi giới dịch vụ làm việc trong môi trường của chúng tôi để giải quyết vụ việc kinh doanh. Tôi không biết tiêu đề thư có tốt không, nhưng câu hỏi của tôi ở bên dưới. Nhưng nó có thể không phải là một câu hỏi hay, vì vậy sau đó là những gì chúng ta đang làm và tại sao tôi nghĩ đó là câu hỏi đúng.
Có bao nhiêu tin nhắn nên được gửi trong một cuộc trò chuyện trước khi kết thúc cuộc trò chuyện?
Chúng tôi muốn sử dụng Nhà môi giới dịch vụ để cập nhật không đồng bộ bảng kết quả. Bảng kết quả được làm phẳng và nhanh chóng. Chúng tôi có các kích hoạt trên các bảng cơ sở gửi tin nhắn với bảng và khóa chính của chúng. Chúng tôi có ba hàng đợi:
- Độ trễ thấp - mục tiêu là 15 giây để xử lý. Nó xử lý các mục thay đổi liên quan đến một mục cụ thể.
- Hàng đợi số lượng lớn - mục tiêu là 5 phút để xử lý. Nó xử lý khi một cái gì đó thay đổi ảnh hưởng đến hàng trăm (hoặc hàng ngàn) mặt hàng. Nó phá vỡ danh sách các mặt hàng bị ảnh hưởng và đưa chúng vào Hàng đợi độ trễ thấp bị trì hoãn
- Trì hoãn độ trễ thấp - mục tiêu là 30 phút để xử lý. Điều này xử lý các mục nhưng chỉ từ hàng đợi số lượng lớn.
Về cơ bản, nếu thông tin của khách hàng cập nhật; có ảnh hưởng đến nhiều sản phẩm để được gửi đến hàng đợi để xử lý chậm hơn. Tuy nhiên, nếu một sản phẩm được cập nhật, nó sẽ được gửi đến hàng đợi có độ trễ thấp.
Chúng tôi sử dụng lại các cuộc hội thoại tương tự như blog của Remus Rusanu http://rusanu.com/2007/04/25/reUSE-conversations/ , ngoại trừ việc chúng tôi thực hiện dựa trên mô-đun của khóa chính. Điều này có lợi ích phụ của việc hỗ trợ sao chép lại khóa chính.
Vì vậy, chúng tôi đang sử dụng lại các cuộc hội thoại và nằm trong hướng dẫn của chúng tôi. Với hai luồng, tôi có thể ghi 125 tin nhắn / giây (giảm giả tạo vài nghìn tin nhắn), nhiều hơn khả năng theo kịp quá trình sản xuất (ước tính 15 tin nhắn / giây).
Tuy nhiên, vấn đề chúng tôi gặp phải là sau một khoảng thời gian, ~ 4 giờ hoặc 120K tin nhắn, chúng tôi bắt đầu thấy các khối và sự tranh chấp cao trên sysdesend và bảng xếp hàng. Các khóa là LCK_M_U và là các khóa KEY. Đôi khi hobt phân giải thành sysdesend và othertimes vào bảng xếp hàng cụ thể (queue_).
Chúng tôi có một quy trình tại chỗ sẽ kết thúc các cuộc trò chuyện sau 24 giờ hoặc 30 phút không hoạt động, vì vậy chúng tôi chỉ có thể tăng thời gian trước khi chuyển qua các cuộc hội thoại.
Chúng tôi đang sử dụng SQL 2016 Enterprise (13.0.4001.0)
- Hỏa hoạn kích hoạt (gửi đến độ trễ thấp hoặc số lượng lớn)
- Tra cứu hoặc tạo xử lý cuộc trò chuyện.
- gửi tin nhắn
- Thủ tục kích hoạt hàng đợi
- Cập nhật bảng kết quả
Quá trình dọn dẹp chạy cứ sau 10 phút để xem có cuộc trò chuyện nhàn rỗi nào không. nếu nó tìm thấy chúng nhiều hơn ba lần liên tiếp, nó đánh dấu nó là không hoạt động và kết thúc các cuộc hội thoại.
Xin vui lòng cho tôi biết nếu có bất kỳ chi tiết bổ sung có thể có lợi. Tôi không có nhiều kinh nghiệm với Nhà môi giới dịch vụ nên tôi không biết tin nhắn / giây của chúng tôi thấp, cao hay thờ ơ.
CẬP NHẬT
Vì vậy, chúng tôi đã thử lại ngày hôm nay và gặp phải vấn đề tương tự. Chúng tôi đã thay đổi thời gian trò chuyện thành 2 giờ và điều đó không có kết quả. Vì vậy, sau đó chúng tôi thực hiện thủ thuật 150; trong đó có cùng một vấn đề.
Hàng tấn chờ đợi trên GỬI CHUYỂN ĐỔI, chờ đợi trên sysdesend. Có ai có thêm ý tưởng nào không?
CẬP NHẬT 2
Chúng tôi đã chạy thử nghiệm lâu hơn hôm nay và trong một trong những khoảng thời gian mẫu là 17 phút, chúng tôi đã xử lý 41K tin nhắn trên 4 tay cầm hội thoại. Chúng tôi đã có thể theo kịp ngoại trừ về cuối khi các khóa trên sysdesend và bảng xếp hàng trở nên quá nhiều và chúng tôi bắt đầu trôi dạt phía sau trước khi dừng nó lại. Chúng tôi dường như không có vấn đề xử lý tin nhắn, không có thứ gì vào hàng đợi, chúng tôi có thể kéo chúng ra và xử lý chúng ít nhất gấp 5 lần tốc độ đó. Tốc độ của chúng tôi dường như bị hạn chế dựa trên việc thêm tin nhắn.
Trong lần kiểm tra sau, chúng tôi đã xóa một trong các trình kích hoạt chiếm 80% số tin nhắn. Ngay cả với tải giảm nhiều này, chúng tôi đã bắt đầu thấy sự chờ đợi tương tự.
CẬP NHẬT 3
Cảm ơn bạn, Remus cho lời khuyên của bạn (và cảm ơn bạn đã đăng các bài viết blog tuyệt vời như vậy về chủ đề này, họ là công cụ để đi đến điểm này).
Chúng tôi đã chạy nó một lần nữa ngày hôm nay và làm tốt hơn (như chúng tôi đã đi lâu hơn trước khi thấy sự chờ đợi và thậm chí lâu hơn trước khi nó làm tê liệt chúng tôi). Vì vậy, các chi tiết.
Chúng tôi đã thay đổi: * Tăng số lượng cuộc hội thoại được duy trì cho mỗi luồng từ 1: 1 lên 2: 1. Về cơ bản, chúng tôi đã có 8 tay cầm hội thoại cho 4 chủ đề.
- hợp nhất hàng đợi số lượng lớn (vì một tin nhắn đến có thể có nghĩa là hàng trăm tin nhắn gửi đi) để hợp nhất thành các tin nhắn nhỏ hơn, lớn hơn.
Lưu ý về nỗ lực này:
vô hiệu hóa thủ tục kích hoạt hàng đợi mục tiêu. không thay đổi trong việc chặn (chúng tôi đã đợi 5 phút) và các tin nhắn đã được gửi đến sys.transmission_queues.
giám sát sys.conversation_endpoint. Con số này tăng từ 0 13K rất nhanh, và sau đó tăng chậm hơn trong suốt cả ngày kết thúc vào khoảng 25K sau ~ 5 giờ. Chặn không bắt đầu xảy ra cho đến khi nó đạt 16K +/-
Tôi đã đi vào DAC và chạy các lệnh DBREINDEX cho các hàng đợi, mặc dù từ một truy vấn, các bản ghi ma không bao giờ vượt quá 200 hoặc trước khi dọn dẹp xuất hiện và giảm số đếm xuống 0.
sysdesend và sysdercv có số lượng giống hệt nhau là 24.932 khi tôi kết thúc bài kiểm tra.
chúng tôi đã xử lý ~ 310K tin nhắn trong 5 giờ.
Chúng tôi đã đi rất lâu trước khi mọi thứ sụp đổ đến mức tôi thực sự nghĩ rằng chúng tôi sẽ làm điều đó lần này. Ngày mai chúng tôi sẽ cố gắng buộc các tin nhắn đi qua dây.
sys.conversation_endpoints
quá trình kiểm tra là bao nhiêu (không đổi hoặc đang tăng và mức độ lớn khi ngăn chặn xảy ra). 2) Khi việc chặn xảy ra, việc vô hiệu hóa hàng đợi đích sẽ tạo ra sự khác biệt trong việc chặn SEND (vô hiệu hóa hàng đợi sẽ định tuyến SEND đến sys.transmission_queue). và 3) Buộc các tin nhắn đi đến dây, thậm chí cục bộ (thiết lập điểm cuối SSB, thêm tuyến đường) thay đổi hành vi trong thời gian dài
ALTER QUEUE ... REBUILD
có tạo ra sự khác biệt khi việc chặn bắt đầu không?
we started seeing blocks and high contention on sysdesend and the queue table.
-> Loại chờ - làPAGELATCH_EX/SH and WRITELOG
gì? Bạn đã sử dụng thủ thuật 150 ? Nếu các bảng hệ thống là điểm tranh chấp của bạn, thủ thuật 150 sẽ rất hữu ích.