2012-10-15 59 views
35

Ở mức độ cao, đây là những gì đang xảy ra:Tin nhắn dịch vụ môi giới không được gửi nếu mục tiêu khởi động lại

  1. Chúng tôi có hai SQL Server 2008 hệ thống R2 SP1 (Standard Edition trên Windows NT 6.1 (Build 7601: Dịch vụ Pack 1)) Chúng được làm hài lòng cùng tốt, giao tiếp hai chiều mà không có lỗi hoặc vấn đề.
  2. Chúng tôi khởi động lại hệ thống số 2, mong rằng bất kỳ thông điệp nào của Nhà môi giới dịch vụ được gửi đến trong khi nó không khả dụng sẽ xếp hàng trên hệ thống # 1, cho đến khi hệ thống # 2 trở lại.
  3. Hệ thống số 2 trở lại và mọi thứ bắt đầu bình thường không có lỗi.
  4. Các thư được xếp hàng đợi trên hệ thống số 1 cho hệ thống số 2 vẫn được xếp hàng đợi; họ không bao giờ được gửi đi. Hơn nữa, tin nhắn mới trên cuộc hội thoại đó cũng xếp hàng và không bao giờ được gửi đi.
  5. Tin nhắn được gửi trên các cuộc hội thoại mới được truyền đi tốt.

tin chi tiết về các thông điệp mà không bao giờ được gửi:

A. Trong khi hệ thống # 2 là xuống, transmission_status cho các thông điệp trong hàng đợi chương trình lỗi khác nhau chỉ ra rằng nó không thể giao tiếp với hệ thống # 2, như kỳ vọng.

B. Ngay sau khi hệ thống # 2 trở lại, hộp thoại truyền cho các thư đó bị trống. Trạng thái trống không bao giờ thay đổi sau thời điểm này.

C. Cuộc hội thoại nơi thư được xếp chồng lên trong trạng thái CONVERSING/CO. Không có cột nào trong chế độ xem hệ thống cho biết bất kỳ điều gì khác với các hàng đợi khác đang hoạt động tốt. (Nếu tôi có thể tìm thấy bất kỳ cờ nào được đặt khác, tôi sẽ biết chấm dứt cuộc trò chuyện xấu, nhưng hệ thống không đưa ra manh mối nào - ngoài độ sâu hàng đợi ngày càng tăng.)

D. Thư không bao giờ được nhận trên hệ thống # 2, theo nghĩa là quy trình lưu trữ kích hoạt của tôi không bao giờ được gọi cho các thông báo này.

E. Trong Profiler (với tất cả các loại dấu vết Broker bật), một cuộc nói chuyện tốt cho thấy những điều này đang được đăng nhập:

Broker:Conversation CONVERSING 1 - SEND Message  Initiator          
Broker:Message Classify 2 - Remote Initiator 
[SQL Batch complete; SQL that caused the SEND to occur] 
Broker:Remote Message Acknowledgement 1 - Message with Acknowledgement Sent Initiator 
Broker:Message Classify  1 - Local Initiator 
Broker:Conversation CONVERSING 6 - Received Sequenced Message Target 
Broker:Remote Message Acknowledgement 3 - Message with Acknowledgement Received  Initiator 
Broker:Activation  Microsoft SQL Server Service Broker Activation 1 - Start 

Một thông điệp được gửi đi mà là mệnh để có được chương trình gặp khó khăn chỉ có hai đầu những sự kiện đó:

Broker:Conversation CONVERSING 1 - SEND Message Initiator 
Broker:Message Classify 2 - Remote Initiator 

Theo tôi có thể nói, đây là tất cả những thông điệp xa hơn. Không có dấu hiệu cho thấy SQL Server cố gắng truyền lại chúng. Hệ thống số 1 cho rằng cuộc trò chuyện vẫn tốt, nhưng Hệ thống số 2 đã quên hoàn toàn. Hệ thống # 1 không bao giờ có vẻ như con số này ra. Nếu sau đó chúng tôi khởi động lại hệ thống số 1, thì mọi thứ trở lại bình thường với tất cả các messags chảy như dự định.

Tôi đã xem xét rằng những thư này thực sự đã được gửi, nhưng xác nhận không được đưa trở lại hệ thống # 1. Nhưng tôi không thấy bất kỳ bằng chứng nào về hàng đợi được thừa nhận.

Chúng tôi đã kiểm tra nhiều vấn đề điển hình ở cả hai bên:

Nhà môi giới được bật ở cả hai bên. 2. Tất cả các hàng đợi được bật, với tất cả mọi thứ thích hợp được bật (enqueue, receive). Hàng đợi không bị nhiễm độc. 3. Không có vấn đề về quyền tồn tại mà chúng tôi biết. 4. Chúng tôi không sử dụng lửa và quên. 5. Chúng tôi đang sử dụng lại các cuộc hội thoại, như nhiều người khác nhau khuyên bạn nên làm. (Trong thực tế, việc sử dụng lại cuộc hội thoại là vấn đề ở đây!) 6. Chúng tôi đang bẫy các ngoại lệ SQL, sử dụng các giao dịch theo hướng dẫn, vv 7. ssbdiagnose không trả về lỗi nào.

Khi máy chủ lưu trữ SQL Server được khởi động lại, chúng tôi hy vọng rằng mọi thư được xếp hàng đợi cuối cùng sẽ được gửi, nhưng chúng không được gửi. Chuyện gì đang xảy ra ở đây??

+1

Bạn có thể đính kèm Profiler trên máy mục tiêu để xem điều gì đang xảy ra sau khi khởi động lại không? Lỗi phải được nâng lên trên mặt của nó. – Dalex

+0

Bạn cũng nên thử nghe các cuộc thi "Kiểm toán bảo mật -> Kiểm toán môi giới" và "Kiểm toán bảo mật -> Kiểm tra môi giới". Hãy đảm bảo rằng bạn làm điều đó trên cả hai mặt. Ngoài ra, điều thú vị là SSBDiagnose.exe không phát hiện bất kỳ vấn đề cấu hình SSB nào. – Nabheet

+1

Tôi đã gặp nhiều sự cố với nhà môi giới khi khởi động lại hoặc không hoạt động. Cuối cùng tôi quyết định sử dụng một hàng đợi bình thường, chèn một bản ghi trong hàng đợi và sử dụng nhà môi giới tin nhắn để gửi id mục hàng đợi. Sau đó, tôi cũng đã viết một xử lý hàng đợi định kỳ. Vì vậy, trong 99% trường hợp tất cả mọi thứ hoạt động tốt với các nhà môi giới tin nhắn, trong 1% tôi bỏ lỡ tin nhắn xử lý hàng đợi (dựa trên thời gian) chọn nó lên. – Paul

Trả lời

3

Tôi hiểu đây là một chủ đề khá cũ, nhưng tôi đã đấu tranh chính xác tình huống tương tự trước đây, và trong trường hợp của tôi cấu hình mạng là thủ phạm. Đối với một số lý do, người khởi xướng đã gửi tin nhắn của nó từ một địa chỉ IP, nhưng một IP khác đã được mở để chấp nhận trả lời đến (và IP thứ hai này đã được xác định trong tuyến đường của mục tiêu).

Tôi đã vô tình phát hiện ra điều này. Khi tôi cố gắng kết thúc cuộc nói chuyện ở phía mục tiêu, nó đã không đóng cửa, nhưng thông điệp EndDialog xuất hiện trong sys.transmission_queue với tình trạng:

Connection attempt failed with error: '10060(A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.)'.

Tôi không có ý tưởng tại sao mục tiêu khởi động lại đã gây ra sự sụp đổ, nhưng khi các kỹ sư mạng đã khắc phục sự cố và tôi đã thay đổi tuyến đường của mục tiêu, mọi thứ đã bay đến đích của họ như được cho là ngay từ đầu.

+0

FYI thông báo lỗi này sẽ được ghi vào hồ sơ là [Môi giới: Lớp sự kiện kết nối] (http://technet.microsoft.com/en-us/library/ms190760 (v = sql.110) .aspx). ['ssbdiagnose.exe'] (http://msdn.microsoft.com/en-us/library/bb934450.aspx)' RUNTIME' cũng nên nắm bắt sự kiện này và báo cáo sự kiện đó, cùng với nhiều chẩn đoán khác. –

+0

@RemusRusanu - xấu hổ với tôi, tôi không biết về công cụ này lúc đó. Và chúng tôi cũng đã cố gắng triển khai các hộp thoại có thể tái sử dụng, vì vậy việc đóng chúng trên mặt đối tượng không giống như một điều hiển nhiên. –

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