2011-12-19 35 views
5

Tôi hiện đang làm việc trên một dự án có sử dụng WebSockets làm cách chuyển dữ liệu cho khách hàng của tôi. Cơ sở hạ tầng trông như thế này.
Khách hàng -> Máy chủ web -> Cơ sở dữ liệu Microsoft SQLTrình nghe WebSocket cho Cơ sở dữ liệu Microsoft SQL

Tôi nghĩ rằng tình huống lý tưởng nhất sẽ như sau: Khách hàng sẽ mở ổ cắm cho Máy chủ. Máy chủ sẽ mở một ổ cắm vào Cơ sở dữ liệu Microsoft SQL. Bất cứ khi nào cơ sở dữ liệu được cập nhật (một số dữ liệu đã được chèn vào), DB ghi dữ liệu vào socket. Máy chủ ghi dữ liệu trở lại máy khách. Điều này có thể là một chút tẻ nhạt mặc dù, có lẽ tôi bằng cách nào đó có thể mở một ổ cắm cho DB từ khách hàng trực tiếp?

Tôi muốn biết nếu có cách tự động thông báo cho socket đến máy chủ web nếu cơ sở dữ liệu MSSQL được cập nhật, để nó có thể xử lý thông tin đó.

Câu hỏi chính là thực sự; Tôi sẽ làm công việc này như thế nào? Tôi đã xem xét một số dự án làm việc với WebSockets như Node.JS và Socket.IO, cũng là Tornado. Mặc dù tôi đã không tìm thấy bất kỳ manh mối nào về nơi để tìm kiếm tính năng cụ thể này. Tôi đã tìm thấy một số trình điều khiển khá không ổn định cho cơ sở dữ liệu MSSQL cho NodeJS nhưng không hiểu nếu có bất kỳ cách nào để tạo một socket cho DB và ngay lập tức gửi dữ liệu thông qua socket khi nó được bơm vào cơ sở dữ liệu. Tôi cũng nhận ra rằng việc tạo một ổ cắm giữa máy khách và db sẽ không thông minh khi nói rằng bảo mật ít nhất, vì bây giờ đó không phải là vấn đề, và SQL không phải là cách để đi cho các ứng dụng thời gian thực nhưng tôi ' m ràng buộc để nó cho bây giờ :)

Sửa 1:

Nhờ @tomfanning bây giờ tôi biết về một giải pháp cho vấn đề này nhưng nghi ngờ nghiêm trọng đến sự cải thiện trong hoạt động. Hãy để tôi hình dung tình hình cho bạn. Trong trường hợp tôi sẽ sử dụng Trigger trên cơ sở dữ liệu MSSQL, tôi tưởng tượng điều này xảy ra.

Tình hình 1

  1. Cơ sở dữ liệu được cập nhật
  2. Trigger được kéo
  3. Kịch bản CLR tạo ra một kết nối tới máy chủ Web. Hoặc thông qua một ổ cắm mà nó có để mở và đóng cho mỗi kích hoạt hoặc thông qua một yêu cầu HTTP (S) trong đó bao gồm việc mở và đóng cửa một Header (mà là overhead vô dụng)
  4. Web Server nhận được kích hoạt và phát ra dữ liệu cho ứng dụng .
  5. Bản cập nhật của khách hàng.

Và bây giờ giả sử tình huống tương tự, nhưng sau đó với AJAX

Trường hợp 2:

  1. Đã hết thời gian của 1000ms được thiết lập trong ứng dụng cho AJAX yêu cầu
  2. Thời gian của khách hàng và yêu cầu AJAX
  3. Cơ sở dữ liệu thực hiện một số truy vấn và đăng lại kết quả
  4. Bản cập nhật của khách hàng.

Trong trường hợp 1 bạn cần cả yêu cầu và ổ cắm/nhận và trong trường hợp 2, bạn chỉ cần một yêu cầu. Nếu tôi đã thiết lập thời gian chờ của yêu cầu AJAX đến 10MS nó sẽ xuất hiện cho người dùng như thể nó là một ứng dụng thời gian thực như một websocket? Hay tình huống 1 vẫn hiệu quả hơn và tôi chỉ phóng đại?

Cảm ơn trước!

+0

Nếu bạn có thể truy cập db của mình qua websockets theo cách không an toàn, tôi cũng có thể. Nếu tôi có thể truy cập db của bạn, tôi sẽ troll nó cho lulz. An ninh không phải là một trò đùa. – Raynos

+0

@Raynos Tôi biết bảo mật không phải là một trò đùa và tôi chắc chắn sẽ xem xét nó. Nhưng tôi chỉ cần biết liệu có cách nào để làm điều này bây giờ không. –

Trả lời

3

Giải pháp có thể có thể là T-SQL triggers on INSERT or UPDATE với CLR procedure sẽ gửi một số thông báo đến ứng dụng chính của bạn, sau đó bơm dữ liệu cho khách hàng của bạn thông qua websockets. Sẽ tránh cần phải thăm dò ý kiến ​​cơ sở dữ liệu.

Mỗi bình luận của bạn - không chắc AJAX sẽ giúp bạn cụ thể như thế nào - bởi vì là một công nghệ được điều khiển từ trình duyệt, giải pháp của bạn sẽ lại được bỏ phiếu, mà tôi hiểu bạn muốn tránh. WebSockets giống như âm thanh phù hợp ở đây vì nó cung cấp cho bạn khả năng thực hiện "đẩy" thực sự từ máy chủ đến máy khách mà không yêu cầu phiếu thăm dò ý kiến.

Rõ ràng là tôi đang nói về các thuật ngữ rất chung chung và lý thuyết ở đây.

+0

Tôi thực sự có ý định tránh bỏ phiếu và muốn sử dụng WebSockets trong ứng dụng của tôi. Nhưng hãy tưởng tượng một trigger được kéo và kịch bản đang được thực thi, cơ sở dữ liệu sẽ phải thiết lập kết nối tới máy chủ Web thông qua một socket hoặc nó sẽ mở yêu cầu như một liên kết hoặc một cái gì đó tương tự. Điều đó có nghĩa là nó sẽ phải xây dựng một Tiêu đề mà tôi muốn tránh do phí tổn. Nếu tôi đã làm một yêu cầu AJAX từ máy khách đến máy chủ, nó sẽ có một yêu cầu thay vì 1 yêu cầu + chuyển ổ cắm phải không? –

+0

Không có cách nào nó là một ý tưởng hợp lý trong bất kỳ kịch bản nào tôi có thể nghĩ đến việc có bất kỳ mã khách hàng nào nói trực tiếp với máy chủ cơ sở dữ liệu. Vì vậy, bạn sẽ luôn có một số dạng phần mềm trung gian, và do đó có hai kết nối (một giữa máy khách và máy chủ web, một giữa máy chủ web và máy chủ cơ sở dữ liệu) thay vì một, bất kể công nghệ. Và nếu bạn bắt đầu cập nhật * từ * phía máy khách, bạn sẽ luôn ở trong một mô hình bỏ phiếu, sẽ ít có khả năng mở rộng hơn mô hình đẩy. Nếu bạn muốn có một mô hình đẩy đúng, bạn cần phải bắt đầu hoạt động bằng cách nào đó từ cuối cơ sở dữ liệu. – tomfanning

+0

Tôi vừa nghĩ, cũng như một trigger INSERT hoặc UPDATE trong cơ sở dữ liệu sẽ chỉ mở một kết nối đến ứng dụng web, có thể lần lượt biết về rất nhiều (hàng chục, hàng nghìn ..) của khách hàng cần nhận thông báo qua WebSockets.Đó là tấn tốt hơn so với việc có hàng ngàn khách hàng gửi yêu cầu AJAX định kỳ để thăm dò ý kiến ​​cập nhật, do đó sẽ gây áp lực lớn lên cơ sở dữ liệu. – tomfanning

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