Показывать данные в реальном времени пользователям с помощью node.js и socket.io - PullRequest
2 голосов
/ 28 апреля 2011

Я стремлюсь оптимизировать / обновить наше веб-приложение с традиционного PHP / MySQL до более эффективной технологии. Я исследовал node.js, socket.io и CouchDB, которые выглядят многообещающе, но я ищу рекомендации и некоторую помощь в выборе лучших технологий для того, что мы хотим.

Итак, чтобы обрисовать, что в настоящее время делается ...

У нас есть устройства, которые собирают данные и отправляют их на FTP-сервер (через файл .txt). Скрипт PHP запускается каждые 5 минут, сканируя FTP на наличие файлов .txt, отправляемых устройствами. Содержимое файлов вставляется в базу данных MySQL, а файл .txt удаляется. Другой сценарий PHP, который запускается каждые 15 минут, будет сопоставлять данные из базы данных (например, значения сумм за последний час) и создавать XML-документ, который будет считываться с помощью набора номера Flash.

Очевидно, что здесь много проблем, и это далеко от решения в реальном времени, к которому мы стремимся. Решение, которое нам хотелось бы, заключается в том, чтобы каким-то образом он мог определять, когда txt-файл загружается на FTP, и обрабатывать только данные (а не иметь установленный интервал времени). Данные по-прежнему должны быть добавлены в базу данных и прочитаны внешним интерфейсом, как только они будут добавлены в базу данных. Вспышка будет удалена полностью, так как это немного ... ick ...

Благодаря новым захватывающим технологиям, таким как node.js и Web Sockets (socket.io), я уверен, что мы могли бы значительно улучшить этот процесс! Я знаю, что Ajax способен делать что-то подобное, но слышал, что он имеет довольно высокие издержки по сравнению с веб-сокетами Мне также немного неясно, как база данных будет работать с node.js, не говоря уже о лучшем варианте того, что нам нужно ...

Спасибо!

1 Ответ

3 голосов
/ 28 апреля 2011

Node хорошо работает с NoSQL (особенно с NoSQL на основе JSON), но, поскольку они являются модулями для обработки большинства баз данных в узле, которые являются асинхронными и возвращают объекты javascript, я не отказался бы от использования MySQL, если вам удобнее его использовать.

Вот схема агностика базы данных.

var fs = require('fs');  //to watch the FTP
var db = require('db');  //your choice of db
var express = require('express'); //http server
var io = require('socket.io'); //for realtime data push
var app = express.createServer(); //create http server
/*...usual express implementation...*/
app.listen(80);
var socket = io.listen(app); 
db.connect( ..., start );
function checkForFiles () {
  fs.readdir( FTPpath, sendFilesToDB );
};
function sendFilesToDB ( err, files ) {
  if( files.length === 0 ) {
    return checkForFiles();
  }
  db.insert( fileToQuery( files.pop() ), function () {
    sendFilesToDB( err, files );
  });
}
function fileToQuery ( file ) {
  ...
  return query;
}
function start () {
  checkForFiles();
  setTimeout( checkData, 1000 );
}
function checkData () {
  db.query( '....', function ( err, data ) {
    socket.broadcast( processData( data ) );
    setTimeout( checkData, 1000 );
  }
}
function processData (data) {
  ...
  return data;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...