Як потокові ресурси вписуються в парадигму RESTful?


101

За допомогою послуги RESTful ви можете створювати, читати, оновлювати та видаляти ресурси. Це все добре працює, коли ви маєте справу з чимось на зразок активів бази даних - але як це перекладається на потокове передавання даних? (Або це?) Наприклад, у випадку з відео, здається, нерозумно трактувати кожен кадр як ресурс, який я повинен запитувати по одному. Швидше я встановив би з'єднання з сокетом і передав би ряд кадрів. Але чи це порушує парадигму ВІДПОВІДНОГО? Що робити, якщо я хочу мати можливість перемотати назад або перемотати вперед потік? Чи можливо це в парадигмі RESTful? Отже: як потокові ресурси вписуються в парадигму RESTful?

Що стосується впровадження, я готуюсь створити таку послугу потокових даних, і хочу переконатися, що роблю це "найкращим способом". Я впевнений, що ця проблема була вирішена раніше. Чи може хтось вказати мені на хороший матеріал?


2
Який варіант ви нарешті обрали? Ви подивилися на gRPc? Він підтримує двонаправлене потокове передавання.
Мак

Відповіді:


80

Мені не вдалося знайти матеріали про справді RESTful потокове передавання - схоже, результати в основному стосуються делегування потокового потоку в інший сервіс (що не є поганим рішенням). Тому я зроблю все можливе, щоб вирішити це самостійно - зауважте, що потокове передача - це не мій домен, але я спробую додати свої 2 центи.

В аспекті потокової передачі я думаю, що нам потрібно розділити проблему на дві незалежні частини:

  1. доступ до медіаресурсів (метаданих)
  2. доступ до самого середовища / потоку (двійкові дані)

1.) Доступ до медіа-ресурсів
Це досить просто і з ними можна обробляти чистий і ВІДПОВІДНИЙ спосіб. Наприклад, скажімо, що у нас буде API на основі XML, який дозволяє нам отримувати доступ до списку потоків:

GET /media/

<?xml version="1.0" encoding="UTF-8" ?>
<media-list uri="/media">
    <media uri="/media/1" />
    <media uri="/media/2" />
    ...
</media-list>

... а також до окремих потоків:

GET /media/1

<?xml version="1.0" encoding="UTF-8" ?>
<media uri="/media/1">
    <id>1</id>
    <title>Some video</title>
    <stream>rtsp://example.com/media/1.3gp</stream>
</media>

2.) Доступ до самого середовища / потоку
Це більш проблемний біт. Ви вже вказали на один із варіантів свого питання, а це надати доступ до кадрів індивідуально через API RESTful. Незважаючи на те, що це може спрацювати, я згоден з вами, що це непридатний варіант.

Я думаю, що вибір може бути зроблений між:

  1. делегування потокової передачі в спеціалізовану службу через спеціалізований протокол потокового передавання (наприклад, RTSP)
  2. використовуючи параметри, доступні в HTTP

Я вважаю, що колишній вибір є більш ефективним, хоча він вимагає спеціального потокового сервісу (та / або апаратного забезпечення). Це може бути трохи на межі того, що вважається RESTful, однак зауважте, що наш API є RESTful у всіх аспектах, і навіть якщо спеціалізований сервіс потокової передачі не дотримується єдиного інтерфейсу (GET / POST / PUT / DELETE), наш API робить. Наш API дозволяє нам належним чином контролювати ресурси та їх метадані через GET / POST / PUT / DELETE, і ми надаємо посилання на потокову службу (таким чином, дотримуючись аспекту зв'язку REST).

Останній варіант - потокове передавання через HTTP - може бути не настільки ефективним, як вище, але, безумовно, це можливо. Технічно це не так інакше, ніж дозволяти доступ до будь-якої форми бінарного контенту через HTTP. У цьому випадку наш API надає посилання на бінарний ресурс, доступний через HTTP, а також повідомляє нам про розмір ресурсу:

GET /media/1

<?xml version="1.0" encoding="UTF-8" ?>
<media uri="/media/1">
    <id>1</id>
    <title>Some video</title>
    <bytes>1048576</bytes>
    <stream>/media/1.3gp</stream>
</media>

Клієнт може отримати доступ до ресурсу через HTTP за допомогою GET /media/1.3gp. Один варіант - клієнт може завантажити весь ресурс - прогресивне завантаження HTTP . Більш чіткою альтернативою було б клієнт отримати доступ до ресурсу шматками, використовуючи заголовки діапазону HTTP . Для отримання другого фрагмента 256 КБ файлу, розміром якого є 1 Мб, запит клієнта буде виглядати приблизно так:

GET /media/1.3gp
...
Range: bytes=131072-262143
...

Потім сервер, що підтримує діапазони, відповість заголовком Content-Range з подальшим частковим поданням ресурсу:

HTTP/1.1 206 Partial content
...
Content-Range: bytes 131072-262143/1048576
Content-Length: 1048576
...

Зауважте, що наш API вже повідомив клієнту точний розмір файлу в байтах (1 МБ). У випадку, коли клієнт не знає розмір ресурсу, спочатку слід зателефонувати HEAD /media/1.3gp, щоб визначити розмір, інакше ризикує відповідь сервера 416 Requested Range Not Satisfiable.


2
Нічого ... це чудова інформація. Ви звернули мою увагу на кілька нових способів думати про це. Я також не знав протоколу потокового потоку в реальному часі.
JnBrymn

1
Не проблема, я рада, що могла допомогти. Зауважте, однак, що я ще не мав шансу особисто працювати з протоколами потокової передачі (за винятком прогресивного потокового передавання через HTTP). Я вибрав RTSP лише як приклад, я не можу сказати, чи це може бути корисно у вашому конкретному сценарії. Можливо, ви захочете задати ще одне питання щодо потокової передачі протоколів. Вікіпедія також пропонує хорошу вихідну точку для інших протоколів - дивіться розділи "Проблеми з протоколом" та "Дивіться також" тут: en.wikipedia.org/wiki/Streaming_Media
MicE

1
Дякую, це далеко не найпростіше і технічне пояснення.
silentsudo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.