2009-06-16 11 views
3

Ich habe mehr als 100 Kanäle von Video-Streams zur gleichen Zeit verarbeiten. Ich muss das Video aufnehmen, Miniaturansichten erstellen und sie als Webdienst bereitstellen. Für die Erzeugung von Thumbnails kann ich JMF usw. verwenden (ich habe bemerkt, dass es einen weiteren Beitrag gibt, in dem es darum geht, wie man generiert und auf das man zugreifen kann: better quality thumbnails from larger image files). Aber meine Sorge ist: Wie skalieren? Java EE EJB oder einfach Java SE Threads? Was sind die Nachteile und Vorteile? Wie skaliert man horizontal mit EJB?So skalieren Sie in Java

Ich bin nicht so vertraut mit Skalierbarkeit Problem, und ich schätze Ihre freundlichen Vorschläge sehr.

Danke.

+2

Es gibt keine einzige Antwort auf Skalierbarkeit, noch gibt es eine einfache Möglichkeit, es "durchzusetzen". Es ist so, als würde man fragen: "Wie kann ich durchsetzen, dass ich ein gutes Programm entwerfe"? –

+0

Wie kann ich dann den Titel richtiger machen? Ich bin kein Experte in diesem Bereich und danke für Ihre Anregungen. – Lily

Antwort

4

Zustimmen ... Threads sollten helfen, auf einer einzelnen Maschine zu skalieren. Wenn Sie über verschiedene Maschinen hinweg skalieren möchten, verwenden Sie Terracotta.

0

Java SE-Threads können Ihnen helfen, auf einer einzelnen Maschine zu skalieren, aber wenn Sie horizontal über verschiedene Maschinen hinweg skalieren müssen, wäre EJB eine Möglichkeit, dies zu tun.

Wenn ich es wäre, würde ich es wahrscheinlich auf einer separaten Web-Service-Ebene auslagern, die auf so vielen Rechnern wie nötig ausgeführt werden kann, und dann das Gleichgewicht zwischen diesen Maschinen laden.

+0

Williams, könnten Sie mehr über "Farm es heraus zu einem separaten Web-Service-Tier" erklären, danke. – Lily

+0

Finden Sie heraus, was die kleinste Arbeitseinheit ist, die in einem einzigen Thread funktioniert. Erstellen Sie einen Webdienst für diese Arbeitseinheit. Dieser Dienst könnte parallel auf einer Reihe verschiedener Maschinen ausgeführt werden und hätte einen Lastenausgleich vor ihm, um die Arbeit gleichmäßig zu verteilen. Zuvor würde Ihr Haupt-Webdienst die Aufgabe haben, die Arbeit in die Einzelaufgabenuntereinheiten aufzuteilen und diese Einheiten auf dem Einzelaufgabenservice über den Lastverteiler weiterzuleiten. Es würde die Ergebnisse sammeln und sie an den anfordernden Kunden zurücksenden. –

0

Ich sehe keinen Grund, EJB in dieser Situation zu verwenden. Sie müssen sich fragen, wo der Flaschenhals ist. Meine Wette wird mit der Videoverarbeitung sein. Ich würde Ihre Anwendung profilieren und sehen, wie viele Threads verarbeitet werden können, bevor sie mehr Zeit auf ihre Timeslice warten, als sie verarbeiten. Nach einem Punkt wird das Hinzufügen weiterer Threads nicht mehr Durchsatz hinzufügen. An diesem Punkt wissen Sie, was eine Maschine tun wird und wie viele Maschinen Sie benötigen, um einen bestimmten Durchsatz zu erreichen. Wie Sie über die Maschine skalieren, ist eine andere Frage.

+0

Das ist ein sehr guter Punkt! Experimentieren Sie vor dem Kauf von Hardware, um eine bessere Lösung zu finden. – Lily

0

Dies sind zwei unterschiedliche Probleme.

Capturing/Verarbeitung klingt wie ein Renderfarm-ähnliches Problem. Diese sind trivial horizontal skaliert. Die meisten Lösungen beinhalten eine Warteschlange von Jobs, Sie müssen dies nicht einmal in Java tun. finde einfach eine einfache Lösung, die dir gefällt. "render farm ffmpeg" oder solche Sachen sollten Ergebnisse in Google ergeben.

Ihr Teil, der als Webservice dient, ist etwas undefiniert. Wenn Sie möchten, dass diese Videos zugänglich sind, müssen Sie sie vielleicht nur auf einen HTTP-Server stellen - diese können leicht ausbalanciert werden und sind daher horizontal skalierbar - Speichergeschwindigkeit oder Netzwerkbandbreite wären wahrscheinlich Ihre ersten Engpässe.

0

Lassen Sie den formellen J2EE-Stack zurück.

Eher eine nette Nachrichtenwarteschlange, die JMS mit X-Anzahl von JVMs mit Y-Anzahl der Threads als Verbraucher spricht.