Blob med metadata i molnet
- mån 4 jan, 2010 kl 15:48
- 5 kommentarer
- Databaser, JEE, Java, Programmering, Web 2.0, XML
En vän till mig har skapat en applikation skriven i C++ som körs lokalt på en maskin. För att programmet skall vara användbart behöver den sparade ”banor”, vilket representeras av binärblobbar. I programmet kan man sen spela dessa banor och vid varje speltillfälle skapas det sedan en logg på vad man gjort. Denna logg representeras också av en binärblob.
Nu till problemet. Binärblobbarna (både banorna och loggarna) tillsammans med lite metadata skall lagras på en central server någonstans på internet. Hur skall då serversidan byggas upp för att på enklaste sätt få det att fungera smidigt?
Som jag ser det finns det ett antal vägar att gå:
- Do-it-your-own-way: Koda ihop en server (i Java) som lyssnar på en TCP-port och skapa sedan ett eget protokoll för att skicka/ta emot data. Serversidan sparar/läser från en databas eller direkt till/från fil på disk
- Enterprise-lösningen: Sätt upp en JEE-server där man kodar en servlet/WebService som snackar XML som använder JPA för att läsa/skriva till/från en relationsdatabas
- Web2.0: Skapa en restful webservice (i Java) som sparar metadata i en relationsdatabas (med hjälp av JPA) och pekar ut binärdatan (via en separat URI) som är lagrad via Amazon S3 t.ex.
Utöver dessa alternativ finns det ju en miljon sätt till att lösa problemet på. Min vän funderar på det sista alternativet, men det känns ändå som en del jobb att få ihop allt.
Vad tror du? Har du någon snilleblixt på hur man löser problemet? Ska man tänka på ett helt annat sätt (jag kanske är för insnöad i Java-världen)?
Det känns inte så mycket som ett problem att lagra data på en central server? Som du säger finns en mängd tillvägagångssätt. Jag skulle säga att valfritt kommunikationssätt är bra, eftersom alla de allra vanligaste förlitar sig på HTTP (REST, SOAP, CORBA, Sockets).
Har man väl fått över datan kan man på samma sätt använda valfritt metod att spara i databas: JPA, Hibernate eller ren sql om man skulle vilja det. Känns som att det spelar mindre roll hur man gör, men en objektorienterad metod anser i alla fall jag vara snyggare.
En HELT färdig serverlösning är att använda sig av en FTP-server.
Binärdata kan med fördel hanteras som filer (för testdata, spara lokalt osv).
Det (verkar) finnas en myriad av javabibliotek som kan hjälpa dig med mycket av klientapplikationen…
Jobbar med Java dagligen, men måste säga att Ruby on Rails är ett väldigt trevligt alternativ om man vill få upp något enkelt snabbt och smidigt.
Instämmer Martin. Varför göra det svårare än nödvändigt.. Filerna verkar ju inte behöva skrivas till efter att de skapats och de behöver kunna accessas över nätet. Som klippt och skuret för FTP.
Problemet är den metadata som hör till binärblobben. Denna metadata skall helst in i någon form av relationsdatabas så att den blir sökbar och lätt kan accessas. Om man i så fall först ska skicka upp metadatan (via ett REST-anrop) och sedan skicka binärdatan via FTP, kan det bli problem med att båda operationerna måste ske atomärt.
Ett annat problem är rättighetshanteringen. Varje klient behöver ett användarnamn för att få rättigheter att läsa o skriva från/till servern. Om man både använder REST och FTP behöver FTP serverns autenticering kopplas ihop med den som webservern använder sig av. Dessutom kan det bli problem om klienten befinner sig bakom en NAT:ad brandvägg, då FTP brukar krångla en massa..
Lösningen med FTP blir klurigare ju mer man tänker på det.. bäst hade vart att bygga en lösning själv som helst använder samma protokoll (helst HTTP).