2011-12-19 7 views
5

Obecnie pracuję nad projektem, który musi korzystać z WebSockets jako sposobu przesyłania danych do mojego klienta. Infrastruktura wygląda tak.
Klient -> Serwer WWW -> Microsoft SQL DatabaseModuł nasłuchujący WebSocket dla bazy danych Microsoft SQL

myślę, że najbardziej idealna sytuacja byłaby tak: Klient otwiera gniazdo do serwera. Serwer otwiera gniazdo do bazy danych Microsoft SQL. Ilekroć baza danych jest aktualizowana (niektóre dane zostały włożone), DB zapisuje dane do gniazda. Serwer zapisuje dane z powrotem do klienta. Może to być trochę uciążliwe, może uda mi się jakoś otworzyć gniazdo do bazy danych bezpośrednio od klienta?

Chcę wiedzieć, czy istnieje sposób automatycznego powiadamiania gniazda na serwerze sieciowym, jeśli baza danych MSSQL jest zaktualizowana, aby mógł przetworzyć te informacje.

Główne pytanie jest naprawdę; jak to zrobić? Przyjrzałem się niektórym projektom współpracującym z WebSockets takimi jak Node.JS i Socket.IO, a także Tornado. Chociaż nie znalazłem żadnych wskazówek, gdzie szukać tej konkretnej funkcji. Znalazłem dość niestabilne sterowniki dla baz danych MSSQL dla NodeJS, ale nie rozumiem, czy istnieje jakikolwiek sposób, aby utworzyć gniazdo do bazy danych i natychmiast wysłać dane przez gniazdo, gdy jest ono pompowane do bazy danych.

Rozumiem również, że utworzenie gniazda między klientem a bazą danych nie byłoby zbyt mądrym stwierdzeniem, że jest ono najmniej bezpieczne, ponieważ na razie to nie jest problem, a SQL nie jest rozwiązaniem dla aplikacji działających w czasie rzeczywistym, ale " m związany z nim do teraz :)

edycję 1:

Dzięki @tomfanning teraz wiem o rozwiązanie tego problemu, ale wątpię poprawę wydajności. Pozwól mi sobie wyobrazić sytuację dla ciebie. W przypadku, gdy użyłbym Triggera w bazie danych MSSQL, wyobrażam sobie, że tak się dzieje.

Sytuacja 1

  1. Baza jest aktualizowana
  2. Spust jest ciągnięty
  3. Skrypt CLR nawiązuje połączenie z serwerem WWW. Albo poprzez gniazdko, które musi otwierać i zamykać za każdym spuście lub poprzez HTTP (S) wniosek, który obejmuje otwieranie i zamykanie nagłówka (który jest bezużyteczny overhead)
  4. Serwer WWW odbiera spust i emituje dane do klienta .
  5. Klient aktualizuje.

A teraz wyobraź sobie ten sam scenariusz, ale potem z AJAX

Sytuacja 2:

  1. timeout 1000ms jest ustawiona w kliencie dla AJAX żąda
  2. Klient traci czas i wysyła żądanie AJAX:
  3. Baza danych wykonuje zapytanie i odsyła wynik:
  4. Klient aktualizuje.

W sytuacji 1 potrzebujesz zarówno żądania, jak i gniazda emituj/odbierz, aw sytuacji 2 potrzebujesz tylko jednego żądania. Gdybym miał ustawić limit czasu żądania AJAX na 10MS, to wyglądałby tak, jakby był aplikacją działającą w czasie rzeczywistym, taką jak websocket? A może sytuacja 1 byłaby jeszcze bardziej efektywna i po prostu przesadzam?

Z góry dzięki!

+0

Jeśli możesz uzyskać dostęp do bazy danych za pośrednictwem stron internetowych w niezabezpieczony sposób, mogę również. Jeśli mogę uzyskać dostęp do bazy danych, będę ją trollować dla lulza. Bezpieczeństwo to nie żart. – Raynos

+0

@Raynos Wiem, że bezpieczeństwo to nie żart i na pewno weźmiemy go pod uwagę. Ale muszę po prostu wiedzieć, czy jest na to jakiś sposób. –

Odpowiedz

3

Możliwe rozwiązanie to T-SQL triggers on INSERT or UPDATE z CLR procedure, które wysyła powiadomienie do głównej aplikacji, która następnie przesyła dane do klienta za pośrednictwem stron internetowych. Unikałoby konieczności odpytywania bazy danych.

Według Państwa komentarza - nie wiem, w jaki sposób AJAX w konkretnym przypadku pomógłby Państwu w tym przypadku - ponieważ będąc technologią opartą na kliencie (przeglądarce), rozwiązaniem będzie ponownie pobieranie, które, jak rozumiem, należy unikać. WebSockets brzmi jak odpowiednie dopasowanie, ponieważ daje możliwość wykonania prawdziwego "wypychania" z serwera do klienta bez konieczności przeprowadzania ankiety.

Oczywiście mówię tutaj w kategoriach ogólnych i teoretycznych.

+0

Rzeczywiście zamierzam unikać ankiet i chcę korzystać z WebSockets w mojej aplikacji. Ale wyobraź sobie, że wyzwalacz jest ciągnięty, a skrypt jest wykonywany, baza danych musiałaby ustanowić połączenie z serwerem sieci Web za pośrednictwem gniazda lub otworzyć żądanie jako łącze lub coś podobnego. Oznaczałoby to, że musiałby utworzyć nagłówek, którego chcę uniknąć z powodu kosztów ogólnych. Gdybym miał wykonać żądanie AJAX od klienta do serwera, wymagałoby to jednego żądania zamiast 1 żądania + przeniesienia gniazda? –

+0

W żadnym scenariuszu nie ma sensu myśleć, że każdy kod klienta mówi bezpośrednio do serwera bazy danych. Zawsze będziesz mieć jakąś formę oprogramowania pośredniczącego, a więc dwa połączenia w sumie (jeden między klientem a serwerem internetowym, jeden między serwerem WWW a serwerem bazy danych) zamiast jednego, niezależnie od technologii. A jeśli zainicjujesz aktualizacje * od * strony klienta, zawsze będziesz w modelu odpytywania, który będzie mniej skalowalny niż model wypychania. Jeśli chcesz mieć prawdziwy model wypychania, musisz zainicjować operację w jakiś sposób od końca bazy danych. – tomfanning

+0

Po prostu pomyślałem, że wyzwalacz INSERT lub UPDATE w bazie danych otworzyłby tylko jedno połączenie z aplikacją internetową, która z kolei mogłaby wiedzieć o partycjach (dziesiątkach, tysiącach) klientów, którzy muszą otrzymać push powiadomienie za pośrednictwem WebSockets.To jest lepsze niż tysiące klientów wysyłających okresowe żądania AJAX do sondowania aktualizacji, co z kolei wywierałoby dużą presję na bazę danych. – tomfanning