неділя, 29 квітня 2012 р.

Стрімінг в Sinatra

Починаючи з 1.3.0, Sinatra підтримує стрімінг(streaming API). В інтернеті ви точно стикалися з його реалізацією. Наприклад стрічка Twitter чи новини ВКонтакте.

Іноді потрібно почати відправляти дані клієнту прямо в процесі генерування частин цих даних. В особливих випадках потрібно постійно відправляти дані до тих пір, поки клієнт не закриє з'єднання. Ви можете використовувати метод stream замість написання власних "обгорток".

Почнемо з класичного прикладу з документації Sinatra:
get '/' do
  stream do |out|
    out << "It's gonna be legen -\n"
    sleep 0.5
    out << " (wait for it) \n"
    sleep 1
    out << "- dary!\n"
  end
end

Якщо сервер не підтримує стрімінг (наприклад, WEBRick), то всі дані будуть відправлені за один раз відразу після того, як блок, переданий в stream, завершиться.


Це дозволяє вам реалізувати потокові API, Server-Sent Events, і може служити основою для WebSockets. Також такий підхід можна використовувати для збільшення продуктивності у випадку, коли якась частина контенту залежить від повільного ресурсу.

І що дійсно цікаво: якщо ви працюєте на потоковому(evented) сервері, наприклад Thin, ви можете тримати з'єднання відкритим і легко реалізувати обмін повідомленнями.
Якщо метод stream використовується з параметром keep_open, то він не буде викликати close в об'єкта потоку, що дозволить вам закрити його пізніше в будь-якому іншому місці.

Приклад простого чату:
https://gist.github.com/2551354

Немає коментарів: