Implementace distribuovaného zámku využívající Redis databáze


Redis databáze není jen tak ledasjaká obyčejná věc, dá se využít k implementaci distribuovaného zámku.

O jednu takovou jsem se pokusil v knihovně https://github.com/abelaska/jedis-lock.

Základem je využití vlastnosti funkce SETNX a tou je SET IF NOT EXISTS, tzn. že uloží hodnotu do požadovaného klíče pouze za podmínky, že klíč v daný moment v databázi neexistuje. Využívá se faktu, že Redis funkce jsou atomické.

Postup pro získání zámku je následující:

  1. SETNX lock.name <aktuální Unix timestamp + lock timeout + 1>, pokud je návratová hodnota 1 byl zámek úspěšně získán, v opačném případě se pokračuje dalším krokem.
  2. GET lock.name, provede se kontrola expirace zámku porovnáním hodnoty klíče zámku s aktuálním časem, tzn. že pokud je hodnota klíče zámku menší než aktuální čas je zámek expirovaný a pokračuje se dalším krokem. Pokud zámek expirovaný není pokračuje se krokem 4.
  3. GETSET lock.name <aktuální Unix timestamp + lock timeout + 1>, pokud funkce navrátí stejnou hodnotu jaká byla získaná v předchozím kroku, byl zámek úspěšně získán a zároveň nastaven nový korektní čas expirace. Pokud zámek nebyl získán pokračuje se následujícím krokem.
  4. Funkce počká 100 milisekund a poté pokračuje 1. krokem. Kroky se opakují dokud neuplyne timeout pro získání zámku (defaultní hodnota je 10 sekund).

Nevýhodné je tohle řešení ve chvíli kdy proces alokuje zámek a potom je ukončen aniž zámek uvolní. V tomto případě ostatní procesy zbytečně dlouho čekají než zámek expiruje. Jeden se s tím musí naučit žít.

Pokud používáte Apache Maven postačí do projektu doplnit novou závislost.

<dependency>
    <groupId>com.github.jedis-lock</groupId>
    <artifactId>jedis-lock</artifactId>
    <version>1.0.0</version>
    <type>jar</type>
    <scope>compile</scope>
</dependency>

V příkladu je získán a následně uvolněn zámek s názvem lock.name. Timeout pro získání zámku nastaven na 10 sekund a expirace zámku na 30 sekund.

Jedis jedis = new Jedis("localhost");
JedisLock lock = new JedisLock(jedis, "lock.name", 10000, 30000);
lock.acquire();
try {
  // do some stuff
}
finally {
  lock.release();
}

A nakonec jsem využil https://oss.sonatype.org Maven repositář pro deploy knihovny do Maven Central repositáře. A to přesně podle postupu uvedeném na stránkách Sonatype OSS Maven Repository Usage Guide.

No a to je asi tak všechno. Enjoy ;)

Long time no see


Přiznávám, je to neodpustitelně dlouho co jsem naposled něčím přispěl na blog. Časy se mění, lidi se mění, a tak bych rád změnil i tuto skutečnost a postupem času se rozepsal o všech možných i nemožných věcech se kterými jsem se za celou tu dobu setkal.

Připravil jsem si sérii témat o kterých budu psát. Tak například jde o mé dosavadní zkušenosti s Amazon cloudem, přidám něco o nových technologiích které používám jako je NoSQL Apache Cassandra, Redis, … Nevynechám ani mini recenze některých knih které jsem četl.

Takže pak nezapomeňte komentovat, kritizovat i chválit :) Názorů jeden nemá nikdy dost.

Vodácká Sázava 2010


Přišlo to jako blesk z čistého nebe, kdy na mobilu přistála smska od Toma, že prý jestli nechceme na vodu. No proč ne, kývli jsme na to a dobře jsme udělali. Těch 5 dnů, během kterých jsme urazili něco okolo 80km, stálo opravdu za to. Byla to směs pohody při slunění, kochání se přírodou na voleji, až po smrtelné křeče, zimu a vysílení v peřejích a zdivočelých jezech.

Začalo to nějak takhle.

Podvečer prvního dne jsme se já, Lenka, Tom, Jana, Honza, Martina, Káťa a Martina (teď blonďatá) sjeli vláčkem do kempu v Kácově. Našli jsme plac, postavili stany a vydali se na druhý břeh Sázavy do místního pivovaru, kde na nás čekal Petr, Lukáš, Kuba, Michal a Olga. “Popíjeli” jsme pivo Hubertus za 12 Kč kus, bez následků. První den se nikomu moc spát nechce a tak jsme ještě  zlikvidovali pár piv u řeky a zprovodili ze světa zbytek Becheru s tonikem. Spánek nakonec přišel.

Probuzení do krásného dne. Slunce začínalo pomalu, ale jistě připalovat. Na vodě, jak to teď chápu, se snídá pohromadě. To nám ale tehdá nedocvaklo :) Čekání na lodě. Iniciativně (já, Lenka, Tom a Jana) jsme se vydali za loděmi, zatímco ostatní si prostě počkali, až jim je přivezou. Chybami se člověk učí. Kupodivu se nám povedlo naše objemné zavazadla přebalit do sudu a lodního pytle. Důkaz toho, že zázraky se dějí každý den. Stáhli loď na vodu a poprvé ve svých životech jsme s Lenkou usedli do této vratké, žluté, umělohmotné  kánoe zované Vydra. Zakymáceli se a vyděšeně na sebe pohlédli.) Naštěstí v té části je Sázava volej, takže jsme měli učící proces poměrně klidný a bylo na něj dost času, takže po půl dni na lodi už jsme se dokázali pohybovat žádaným směrem a to dokonce i do stran :D Následoval klidný prosluněný zbytek dne a kochajíce se přírodou jsme pluli v dál. Až navečer jsme zakotvili v kempu. Postavení stanů a hurá směr bufet a pivo. Ovšem tento bufet nebyl jen tak ledajaký bufet, byl to bufet s frontou, kterou tvořili za všech okolností vždy minimálně 3 lidé, v maximu dosahovala skoro 14-16 lidí. Pivo se začalo nakupovat dávkově a to po minimálně 2 kusech. Zdlábli jsme nějakou sekanou a smažák, popíjeli, kecali a bylo dobře. Únava zavelela. Spánek byl občasně přerušovaný opilými hlupáky hrajícími se s vuvuzelou.

Jak už jsme si zvykli, probudilo nás sluníčko. Povinná snídaně zalitá pivním chlebem. Zabalit, namazat pořádně opalovacím krémem, slunce začalo neuvěřitelně pražit, a hurá zchladit na vodu. I v této části je Sázava naprostý volej a tak jsme mohli dál pilovat umění pádlování.) Začalo se pomalu zatahovat. Oběd se realizoval v hotelové restauraci s obsluhou obsluhující rychlostí zamrzlého blesku. Pivo jsme dostali po čtvrt hodině a na jídlo jsme si museli počkat dobře přes hodinu. No co, hladový si počká. Slunce peklo jako o závod a my se po tom voleji vydali dál. Zázemí na noc jsme našli v luxusním kempu. Zapadli jsme do centrální restaurace, kde obsluha byla nehezký vtip a kuchař byl pravděpodobně spící princezna. Martina (Honzova) přes hodinu čekala na jídlo, po době přišla obsluha, že už to co si objednala nemají a tak si musela objednat něco jiného, nakonec objednávku zrušila, no mazec. Začalo pršet a tak nás čekala vlhká (až mokrá) noc.

Ráno katastrofa. Chcalo jak sviňa. Úplné provazy vody. Ani nos se nedal vystrčit. S Tomem jsme převezli auto do Píkovic, abychom se pak měli jak dostat zpátky do Čerčan. Cestou se zdálo, že prší snad jen v Čerčanech. A kolem 11-12 hodiny se počasí nakonec trochu umoudřilo i pobalili jsme a vydali se opět o kousek dál. Vody bylo dost, už to nebyl takový volej jako předešlé dny. Poprvé jsme loď přes jez stahovali a na vodě se to víc houpalo.] Obědvali jsme v super restauraci. Před hajzlíkama bylo zvracítko, to je okachlíkovaný výklenek ve zdi se zazděným pisoárem, zrcadlem a splachovadlem, určitě dost užitečné udělátko.) Navečer se zamračilo, ale stihli jsme doplout do kempu v Čerčanech, což byl travnatý plácek vedle hřiště místní základní školy. Rozbili stany a vydali se za jídlem. Zakotvili jsme v kulturním domě, objednali jídlo a čekali na zbytek posádky. Když konečně dorazili a chtěli si objednat jídlo, bylo jim sděleno, že je již po 9-té hodině a to že už nevaří, takže někteří se vydali o dům dál a ostatní to přešli se skřípějícími zuby a nakládaným hermelínem nebo utopencem. Pojedli jsme, popili a spát. Zázemí na noc jsme našli v luxusním kempu. Večer přišla bouřka, práskalo to sem tam tam sem hromy blesky. Jen jsme čekali, kdy se ty břízy nad námi zlomí a udělají z nás hromádky neštěstí.

Probudili jsme se do zamračeného, studeného, přeháňkového rána. Zpestřením byla procházka na nákup základních surovin (chápej chleba a rum) do města. Posnídali jsme, pobalili, nakoupili a vypluli. Na vodě nás chytla průtrž mračen, z nebe chcaly provazy vody. Nic moc příjemného, ale k vodě to jak jsem zjistil patří. Tak jsme se zastavili v jednom nábřežním bufáči na grog pro zahřátí, pomohl. Dlouho to netrvalo a dopluli jsme do kempu v Týnci nad Sázavou. Nastala rutina, vytáhnout lodě, odstrojit, převrátit, poskládat, složit stan, vyplnit ho karymatkama a spacákama. Šikulka Olga stihla rezervovat stoly v restauraci u kempu (bikesport centrála) a tak se šlo dlabat, bo hlad byl při absenci oběda opravdu opravdu velký. Prostředí příjemné, vyhřáté pecí na pizzu, obsluha super. Většina z nás se dopouštěla úplného obžérství. Tak kupříkladu já měl absolutně skvělou mňam pizzu a na to sem splácal obrovský zmrzlinový pohár :) Když už bylo horko nesnesitelné, přesunuli jsme se ven a hráli městečko Palermo. Kde Lukáš překvapil právnickou sebe-obhajobou proč že to není vrah a že je katány a že ho zamordovat nemůžou :D stejně ho zabili, ale řeč to byla obdivuhodná. Nasyceni a unaveni jsme spokojeně ulehly ke spánku (už žádná vuvuzela).

Světe div se, poslední den nás probudilo sluníčko. Snědlo se co zůstalo, pobalilo a hned za kempem nás čekal první jez onoho dne. Vody bylo dost. Sázava přestala býti volejem a proměnila se v (pro nás vodácké prvňáčky) divokou řeku. Každý následující jez se zdál být horší a divočejší. Pak to přišlo, moc jsem riskoval a najeli jsme na jez příliš pomalu a co se nestalo, prostě jsme se cvakli. Bylo to pro nás s Lenkou první cvaknutí v životě. Nic moc příjemná zkušenost, ale nutná k tomu, aby člověk k vodnímu živlu získal respekt. Zachránil nás Michal s Káťou. Dostali jsme loď ke břehu, odstrojili, převrátili a všechnu vodu vylili. Zase to všechno přivázali a vydali se dál. V člověku to zanechá pachuť strachu a od té doby jsme s ním bojovali až do konce a nutno podotknout úspěšně :) Peřeje začaly být divočejší, loď sebou mlátila skákala víc a víc, až nás jednou takhle jedna vlnka převalila nalevo a BUM cvakli jsme se podruhé. Cvaknou se v peřeji není vůbec nic příjemného, proud je silný, samý velký balvan a spoustu šutrů pod vodou ani není vidět. Tak se tak držíme převrácené lodi v proudu, Lenka vepředu a já vzadu drže obě pádla a snažíce se vymotat z provazu do kterého se mi zachytila noha. Docela nás to o ty kameny domlátilo, Lenka to odnesla modřinama a já i pár lišejema. Nakonec sem podal pádla Krystýně a pomalu jeme se snažili doplavat v tom hnusném proudu s lodí k břehu. Všichni nám pomohli loď obrátit a dostat z ní vodu. Na vodě jsou opravdu skvělí lidé. Bez nich bych si podobný výlet nedokázal představit. Tohle bylo naše poslední cvaknutí. Pak už jsme z posledních sil překonaly poslední část cesty peřejemi a vítězoslavně dorazili do Píkovic, kde celou akci při odevzdávání lodí zakončil lok rumu, hromadné foto, rozloučení a pak se lidi zase rozjeli do všech světových stran.

Těla bolela, ale větší byla radost z toho, že jsme to dokázali a zároveň poznali skvělé lidí.

Zkušenosti jsou nepřenositelné a tohle si člověk opravdu musí zažít, aby pochopil.

Nakonec i hlášku “Mám líného háčka” jsem změnil na “Mám šikovného háčka:D

Jak programátorská krysa sedavá začala se hýbat


Zajímavé, že jako mladší (chápej, pár let zpět) jsem nenáviděl všechny formy pohybu. Byla to pro mě jen ztrátu času. Času, o kterém jsem si myslel, že jej dokážu lépe využít u počítače učejíce se nové zajímavé věci, prozkoumávající nepoznaný nehmotný prostor, než při pobíhání po venku.

Člověk dříve či později dospěje v životě do fáze, obzvláště v dnešní době, kdy ho stres začne pomalu ale jistě ničit. Spoustu sil bere už jenom pouhé držení této stres páry pod pokličkou. Stává se, že sem tam pára přece jenom uteče a pak to zpravidla schytají lidé v nejbližším okolí. Kolegové v práci, rodina, přátelé. Později je to člověku líto, snaží se věci napravit, ale nakonec frustrace jenom přidá více páry do kotle a nebezpečí dalšího výbuchu je ještě větší. Nebezpečná životní spirála je tu. Tuto situaci si uvědomujeme a snažíme se s ní něco dělat, ale někdy prostě řešení nenalézáme.

Já pro sebe řešení našel a tím je sport. Kolo, běh, plavání, pěší turistika, nedávno premiéra na vodě (Sázava). Ať je to jakýkoliv pohyb, pomáhá. Pomáhá čistit hlavu, vlévá do žil optimizmus, sílu překonat tyto každodenní drobnosti.

Takže minimálně jedno řešení tu je. A kdo bude dál hledat určitě najde i další.)

Jak na privátní vzdálený Git repositář zadarmiko


V životě programátorském občas vyvstane potřeba vlastního vzdáleného Git repositáře. Pokud není vyžadován privátní repositář a postačí 300MB dostupného prostor, je možno zdarma využít hostingu na http://github.com/. Tento projekt nabízí potřebnou infrastrukturu pro vedení projektu, jako je wiki, issuer tracker a webové rozhraní Git repositáře. Za mírný poplatek nabízí i privátní repositáře a více dostupného místa.

Já na druhou stranu řešil problém privátního Git repositáře a pokud možno bez nutnosti finančních investice. Nabízela se možnost využití Dropbox, který má v základním programu 2GB prostoru zdarma se zabezpečeným přístupem. Podporované platformy jsou Linux, Windows, MacOS, iPhone, IPad a Android (přibýt má i podpora pro Blackberry), takže ve výsledku je možno data sdílet i mezi odlišnými platformami.

Dropbox je taky možno nahradit za produkt https://www.jungledisk.com/, postup pro použití je shodný, jen JungleDisk nenabízí žádný diskový prostor zdarma.

Dropbox synchronizuje vámi vybraný lokální adresář s vlastním úložným prostorem (je hostován na Amazon). V tomto případě je možno využít klonování lokálně uloženého Git repositáře.

$ git clone file:///home/abelaska/Dropbox/projekt.git

Tímto způsobem je projekt naklonován a je možno jej lokálně modifikovat.

$ cd projekt
$ touch README.txt
$ git add README.txt
$ git commit -m "Přidán prázdný soubor pro popis projektu"
$ git push origin master

V tomto momentě Git uloží změny do pro něj vzdáleného repositáře origin (file:///home/abelaska/Dropbox/projekt.git) a Dropbox pak následně nahraje změněné soubory ve sdíleném adresáři do svého úložiště, odkud si je můžeme stáhnou na jiném počítači, případně s někým sdílet.

Na dalším počítači zase Dropbox adresář sesynchronizuje a pak je na nás abychom si zaktualizovali projekt:

$ git pull origin master

Jednoduché a funkční řešení.

Pořád je co se učit


Hektický, skoro až houpačkový (nahoru, dolu, …), byl poslední čas. Spousta práce, spousta stresu, ale hlavně spousta nových zkušeností.

Úspěšné dokončení projektu bez  jasného vedení, je vykoupeno velkým tlakem a stresem působícím na realizační tým. Těchto pár lidí pak určuje výsledek projektu, který pak záleží jen na jejich kvalitách. Ponaučením budiž to, že každý projekt musí mít vedoucí hlavu s jasnou vizí, v opačném případě je takovýto projekt extrémně rizikový a to ne jen po ekonomické, ale i lidské stránce.

Je zajímavé, že drtivá většina lidí se své neúspěchy snaží zamaskovat, smést z povrchu zemského. Přitom neúspěch je nedílnou součástí cesty k úspěchu. Lidi se svou snahou nechybovat obvykle zablokují natolik, že nedělají raději nic. Nedokumentování a maskování neúspěchů obvykle vede k jejich opakování.

Stres je svině a je třeba s ním bojovat jakýmkoliv možným způsobem.)