Storie dalla Sala Macchine


Home Page | Commenti | Articoli | Faq | Documenti | Ricerca | Archivio | Storie dalla Sala Macchine | Contribuire | Login/Register

Il Martello

Quando tutto quello che hai e' un martello, tutto quello che ti circonda diventa un chiodo.

Probabilmente questa frase l'avete gia' sentita, e si riferisce alla tendenza di certe persone che hanno una qualunque competenza specifica o un "tool" preferito, di applicare sempre e solo quello a tutti i problemi che si presentano. Indipendentemente dal fatto che il tool o la competenza non siano esattamente il meglio per la situazione.

Il guaio di questo approccio e' abbastanza ovvio: qualche volta quella competenza o quel tool e' proprio il peggiore in assoluto per il lavoro in questione.

E adesso parliamo di $processiedaffini, una societa' che fa... diverse cose.

I loro principali strumenti erano Mule ed un sacco di script ed applicazioni specifiche fatte in Python o PHP. Su un database Postgre. Niente di eclatante quindi. Il grosso problema di questa gente era il loro approccio a risolvere tutti i problemi che sorgevano in una modalita' "quick and dirty". Modalita' che funziona nel 99% dei casi, ma non e' che conduca a grandi prestazioni sul lungo percorso.

Ed ecco arrivare IL problema. Uno dei loro clienti aveva certi "processi" che facevano certe cose ed inviavano mails. Il guaio e' che qualche volta tali mails non erano inviate correttamente, in molti casi perche' gli indirizzi che usavano facevano schifo e qualche volta perche' il processo che doveva inviarle andava in tilt.

Il problema non era tanto che quel coso non mandasse mail (io sono sempre in favore di processi che NON mandano mail, meno immondizia da buttare nel secchio) ma che la 'coda' dalla quale estraeva le mail da inviare si ingigantiva in maniera incontrollabile e dopo un po' il processo che la gestiva si bloccava, il che portava ad un fantastico effetto domino che mandava in tilt l'intero sistema.

Dopo un certo numero di allarmi notturni e diurni (perche' quel coso andava in tilt in modo abbastanza random), mi ritrovai a discutere con uno dei loro programmatroti (CL) per cercare di mettere una museruola a quel coso e convincerlo a comportarsi in modo acconcio.

IO - ...quindi se quel coso si incarta ci dovrebbe essere un modo di accorgersene PRIMA che qualche altra cosa cominci a rompersi.
CL - E siamo d'accordo. Il guaio e' che noi non sappiamo bene come fare.
IO - ...come sarebbe a dire non lo sapete? Non lo avete scritto voi quell'arnese?
CL - Si', ma non e' una cosa molto semplice...
IO - Hummm... Quel coso legge una 'coda' ed invia una mail, e poi legge dalla coda. Dove sta il problema a capire se si e' incatastato o no?
CL - Eh... Che ogni volta che gira estre dati dalla coda e noi non siamo sicuri se l'estrazione abbia generato una mail o no.
IO - ...come sarebbe a dire "ogni volta che gira"?
CL - Si, ogni volta che gira.
IO - Perche' gira a volte?
CL - Ogni minuto, praticamente sempre.
IO - ...ogni minuto... Come ogni minuto?
CL - E' in cron.
IO - ... in cron... perche' e' in cron?

A questo punto ho cominciato a fare domande "difficili", tipo chi cazzo ha deciso di mettere un coso in Cron ogni minuto?

Se non siete avvezzi all'Unixverso, probabilmente non avete idea di cosa cappero sia "cron". Cron, e' un orologio, sostanzialmente, quello che fa e' controllare ogni minuto una tabella di "operazioni da eseguire" e se una di queste e' predisposta per essere esguita in quel momento (ora, minuto, giorno della settimana), la esegue.

E' un sistema pratico per eseguire operazioni ripetitive e "a colpo singolo".

Il guaio e' che in molte situazioni, viene abusato o molto semplicemente usato male. Per esempio, che senso ha eseguire la stessa operazione ogni minuto? Una operazione che deve essere eseguita ogni minuto non dovrebbe essere una "operazione", dovrebbe essere un daemon, un processo che funziona continuamente.

Il problema e' che costruire un daemon e' una cosa difficile, o non tanto semplice, mentre chiunque con una minima capacita' di programmazione (e qualche volta senza nessuna capacita') puo' scrivere una procedura ed eseguirla spesso. Il guaio e' che una procedura che funziona "a colpo singolo", quando viene eseguita troppo spesso, puo' non funzionare tanto bene.

E mi rendo conto che abusare cron e' una cosa molto facile da fare, sono anche io colpevole di averlo fatto tempo addietro e Karma il coccodrillo e' ritornato a mordermi le chiappe per quello, quindi tutto come da programma.

IO - ...e per questo sarebbe molto meglio fare un demone invece che usare cron in quel modo.
CL - Un demone? E come cappero lo facciamo un demone? No quello e' troppo difficile.
IO - Difficile? Ma siete dei programmatori o cosa?
CL - Ma come lo facciamo un demone?
IO - Fate un fork nel codice ovviamente.
CL - ...e come lo facciamo in Python?

Ora, io saro' di parte, ma Python proprio non lo digerisco. A me piace aggiungere spazi, tab e linee vuote senza introiare la logica dell'intero script, per questo in genere uso bash o perl.

IO - In Python non lo so, sono quasi sicuro che si puo' fare ma non ho idea come. Se volete vi mando un esempio fatto in Perl.
CL - No, noi perl non lo conosciamo...
IO - Vabbe', come vi pare. Ma questa cosa dovrete sistemarla, perche' in questo modo e' ingestibile.

Un paio di giorni dopo, ci ritroviamo, di nuovo, al capezzale di quell'accrocchio, e la diagnosi e' che i vari CL non hanno seguito il mio consiglio (ecchettipareva) ed hanno invece aggiunto un altro paio di script in cron che girano ogni minuto e di tanto in tanto si accrocchiano uno contro l'altro senza speranza.

CL - ...e cosi' quando il secondo script inizia ed il primo non ha ancora finito...
IO - Ve l'ho gia' detto: quel sistema e' bacato dentro, dovete fare un demone, a questo punto il demone gira quanto vuole e nessuno si preoccupa.
CL - Ma noi siamo abituati cosi'!
IO - Questo non e' un problema mio. Voi mi chiedete come risolvere il problema ed io vi sto dando una soluzione.
CL - Ci sarebbe anche un altro problema.
IO - Un altro?
CL - Si', perche' abbiamo aggiunto questo script che ogni minuto estrae le ultime 300 righe da un database e fa...
IO - Fammi indovinare, vi si incrocchia pure quello?
CL - eh...

Si', perche' quando sei abituato a prendere a martellate qualunque cosa, quando trovi una gomma ed il martello ti rimbalza sulla capoccia e' un po' dura da mandere giu'.

Davide
31/08/2018 15:56

Precedente Successivo

I commenti sono aggiunti quando e soprattutto se ho il tempo di guardarli e dopo aver eliminato le cagate, spam, tentativi di phishing et similia. Quindi non trattenete il respiro.

7 messaggi posta messaggio
Thor Di Thor - postato il 24/09/2018 09:21 - rispondi

Chiamami quando vuoi: sono pronto a usare il mio fedele Mjollnir come strumento omnirisolutivo (tipo, per esempio, per risolvere il problema dei CL piantandoli nel pavimento come chiodi).

:D

--
Thor


Guido Di Guido - postato il 24/09/2018 12:16 - rispondi

'spetta non sono sicuro di aver capito bene: tu hai rilevato che il problema era uno script che girava ogni minuto e gli hai consigliato di "demonizzarlo" - loro come applicazione della tua soluzione hanno creato altri script che girano ogni minuto?

Geniale...

--
who uses Debian learns Debian but who uses Slackware learns Linux


Riccardo Cagnasso Di Riccardo Cagnasso - postato il 24/09/2018 17:32 - rispondi

Beh ma al giorno d'oggi ha senso fare un demone nel senso di una roba che fa doppio fork? In fondo systemd gestisce come demone praticamente qualunque cosa. Ovviamente per fare task periodiche o cose del genere ci sono tool come Celery su python, ma se devi semplicemente leggere da una coda...

--
Riccardo Cagnasso


Akart72 Di Akart72 - postato il 25/09/2018 08:18 - rispondi

Idiocracy era un film profetico

--
Akart72


Lazza Di Lazza - postato il 26/09/2018 01:04 - rispondi

Personalmente uso script in Python presso clienti e funzionano bene, chiaro che bisogna saperli scrivere e purtroppo la facilità di Python attira anche programmatori poco avvezzi. Ad ogni modo con systemd il loro bel daemon che esegue a ripetizione lo farebbero con uno unit file di 3 righe.

Spero che questo commento non venga letto da qualche Devuanista. ;\)

--
Lazza


Jenson@ Lazza Di Jenson - postato il 26/09/2018 10:18 - rispondi

Spero che questo commento non venga letto da qualche Devuanista. ;\)

Mai capito tutto il bric-à-brac su systemd. Fa il suo lavoro come qualunque init di sistema, no? Ma l'hanno attaccato da tutte le parti con le motivazioni più assurde, tipo il fatto che il nome "non segue le Sacre Linee Guida della Santissima Bibbia della Nomenclatura di Linux" (non in termini così espliciti, ma il senso di profanazione dei testi sacri si intuisce). Ma che cazzo.

--
Jenson


Messer Franz Di Messer Franz - postato il 27/09/2018 16:48 - rispondi

Si potrebbe fare un demone che gira ogni 30 secondi e controlla se il cron ha croneggiato, e poi un altro cron per controllare se il demone ha funzionato e così via...se lo fai abbastanza incasinato poi ti assumono alla microsoft che lo propone come nuovo sistema operativo...

--
Messer Franz


7 messaggi posta messaggio

Precedente Successivo


Il presente sito e' frutto del sudore della mia fronte (e delle mie dita), se siete interessati a ripubblicare uno degli articoli, documenti o qualunque altra cosa presente in questo sito per cortesia datemene comunicazione (o all'autore dell'articolo se non sono io), cosi' il giorno che faccio delle aggiunte potro' avvisarvi e magari mandarvi il testo aggiornato.


Questo sito era composto con VIM, ora e' composto con VIM ed il famosissimo CMS FdT.

Questo sito non e' ottimizzato per la visione con nessun browser particolare, ne' richiede l'uso di font particolari o risoluzioni speciali. Siete liberi di vederlo come vi pare e piace, o come disse qualcuno: "Finalmente uno dei POCHI siti che ancora funzionano con IE5 dentro Windows 3.1".

Web Interoperability Pleadge Support This Project
Powered By Gojira