Implementare il lock dei record in Appian

In questo articolo illustriamo i meccanismi di lock disponibili sulla piattaforma appian

Non è raro un requisito in cui vi è bisogno di proteggere un record da scritture concorrenti. A tal fine, la piattaforma supporta due meccanismi di lock : il locking ottimistico e pessimistico.

I modelli di lock

I lock dei dati in Appian è implementato secondo due modelli :

  • Il lock ottimistico, in cui la scrittura di un record viene verificata (ed eventualmente bloccata) solo al tempo di esecuzione del commit delle modifiche sul database
  • Il lock pessimistico, in cui un record viene bloccato appena si richiede di effettuarne la modifica.

In generale entrambi i modelli di lock sono validi soltanto se si è coerenti nella generazione delle scritture al database, vale a dire, in tutti i casi non è garantita la coerenza dei dati a livello di sistema.

Il lock ottimistico

Il lock ottimistico si ottiene aggiungendo un campo integer sulla tabella di cui si vuole implementare i lock.
Prelevo un record con versione 1 e lo modifico, quando lo aggiorno leggo la versione: se il valore della colonna è 1 allora l’aggiornamento è valido, se invece la versione è 2 (o altro) vuol dire che quel record è stato già modificato e quindi devo bloccare l’aggiornamento.

Implementazione

Molto semplicemente, bisogna creare un campo numerico che conterrà la versione del record, successivamente aggiungere l’annotazione @Version sul campo. Dopo aver pubblicato l’entità relativa al CDT, utilizzando lo smartservice write to datastore, in caso di aggiornamenti incoerenti il sistema solleva una StaleObjectStateException che ci avverte che stiamo tentando di sovrascrivere un item già aggiornato.

Considerazioni

  • Con StaleObjectStateException il processo che contiene la scrittura è messo in pausa.
  • Sarà compito di chi gestisce la piattaforma di risolvere l’incoerenza che si è generata e nel caso scartare il processo scaduto.
  • Questo lock funziona correttamente solo se si utilizzano esclusivamente i write to datastore, gli aggiornamenti mediante storedprocedure restano impossibili da controllare.

Il lock Pessimistico

Il lock ottimistico è ben più complesso e meno definito da appian stesso. In sostanza dobbiamo creare un meccanismo che impedisca di recuperare il lock per la modifica in modo da assicurarci che le modifiche siano sempre coerenti.

Implementazione

Abbiamo bisogno di una tabella che contiene i lock. Tale tabella che chiamiamo lockTable dovrà contenere almeno:

  • Il nome del tipo dato, in questo esempio chiamiamo tale colonna NameType.
  • l’id del record da bloccare, in questo esempio chiamiamo tale colonna idType.

A questo punto definiamo come chiave unique la coppia NameType e idType all’interno della tabella lockTable.

Il passo successivo è creare una stored procedure getLock al cui interno proveremo a scrivere, in transazione, all’interno della tabella lockTable un record con rispettivamente il nome del tipo da modificare in NameType e come idType la chiave primaria. Infine bisogna creare una stored procedure releaseLock in cui si elimina il record dalla tabella lockTable una volta terminata la modifica.

Considerazioni

  • In questo caso l’eccezione lanciata dal database sarà chiave duplicata in caso di una getLock di un record già bloccato.
  • Sarà compito di chi gestisce la piattaforma di risolvere l’incoerenza che si è generata e nel caso scartare il processo scaduto.
  • Questo lock può essere utilizzato sia con stored procedure che con write to entity datastore.

Quale lock scegliere?

Appian consiglia il lock ottimistico : più leggero e facile da implementare, solo in casi estremi bisogna utilizzare il lock pessimistico. La mia risposta invece è dipende, se abbiamo un bisogno assoluto di garantire la coerenza il lock pessimistico è una buona scelta. Nel lock ottimistico un record può essere compromesso mediante stored procedure e in ottica estendibilità non metterei la mano sul fuoco per cui nel corso del tempo non si abbia bisogno di una stored procedure.

Bibliografia

https://community.appian.com/discussions/f/integrations/2995/does-appian-support-version-jpa-annotation

https://community.appian.com/w/the-appian-playbook/196/data-locking-strategies

Appian, piattaforma condivisa oppure dedicata?

In questo articolo discutiamo la necessità di dove posizionare una nuova applicazione appian, se condivisa o dedicata, considerando le nuove feature introdotte con la versione 21.3.

Abbiamo già introdotto la piattaforma nei suoi elementi più essenziali. In questo articolo fornirò la mia personalissima opinione sulla necessità di dove posizionare una nuova applicazione appian, in un ambiente ad-hoc oppure l’installazione in un ambiente preesistente.

Scenario

Il cliente ci chiede lo sviluppo di una nuova applicazione appian. Abbiamo già un ambiente di produzione in cui abbiamo già diverse applicazioni installate e funzionanti.

L’immagine è esemplificativa: vogliamo aggiungere l’Application 3 e vogliamo capire se scalare orizzontalmente o meno.

In generale dobbiamo domandarci:

  1. In caso di fault entro quanto la mia applicazione deve ritornare disponibile?
  2. Quale range temporale dati posso “permettermi” di perdere in caso di fault?
  3. I dati di questa nuova applicazione necessitano di segregazione rispetto alle altre applicazioni?
  4. Gli utenti che utilizzeranno la nuova applicazione utilizzeranno anche le applicazioni preesistenti? il dominio dei dati è strettamente correlato alla nuova utenza?

Per le domande 1 e 2, dobbiamo considerare se la nuova applicazione si discosta da quelle già presenti: è ragionevole clusterizzare le applicazioni che hanno gli stessi requisiti di alta affidabilità (HA). Sarebbe discutibile installare un’applicazione “critica” in un ambiente in cui le applicazioni preesistenti non lo sono.

La domanda 3 apre un tema in cui il prodotto si evolvendo : precedentemente alla versione 21.3 la segregazione è possibile impostando origini dati alternative e quindi utilizzando database diversi. Dalla versione 21.4 è possibile creare nuovi schemi sulla stessa instanza del database a cui le applicazioni possono accedere. Tratterò questo argomento in un futuro (stay tuned!).

La domanda 4 apre molteplici scenari: da un punto di vista della sicurezza, spesso nelle aziende la divisione dei dati è adottata come misura precauzionale per mitigare il rischio di rilascio incontrollato di informazioni, da un punto di vista prestazionale dobbiamo curare l’approccio in base al numero di utenti che verranno introdotti sulla piattaforma. Verranno aggiunti un numero non trascurabile di nuovi utenti. Per affrontare il tema dobbiamo considerare se le risorse allocate su appian sono sufficienti a sostenere l’ingresso dei nuovi utenti: in alternativa potremmo aver abbiamo bisogno fare scaling della piattaforma.

Appian riassume così i requisiti minini :

Tipologia di utilizzoUtenti
concorrenti
RAM (GB)CPU
Applicazione singola< 100304
Uso dipartimentale100 – 1,000608
Utilizzo Aziendale> 1,00024032
Raccomandazioni sizing piattaforma appian per utenti/tipologia di utilizzo


Avere un bacino d’utenza ampio è un chiaro segnale di un requisito inespresso di HA. Considero difficile che a fronte di una moltidine di utenti (quindi costi non trascurabili) fruitori non corrisponda un requisito particolare di High Availability, di fatto stiamo torniamo alla considerazione che risponde alla domanda 1 e 2.

Verranno aggiunti un numero trascurabile di utenti

In questo caso è difficile ipotizzare che si è obbligati a segregare gli ambienti: come già abbiamo visto per la domanda 3 la segregazione dei dati è ottenibile restando sulla stessa piattaforma. L’unico fattore che ci resta da considerare sono i requisiti di HA, per cui o abbiamo già requisiti molto più stringenti oppure bisogna prepararsi a requisiti molto più stringenti.

Considerazioni finali

Appian, escludendo casi particolari, consiglia l’ambiente condiviso.

I vantaggi dell’ambiente condiviso sono molteplici, cito tra i più importanti:

  1. Possiamo riutilizzare le componenti scritte migliorando la manutenibilità dell’applicazione stessa e delle applicazioni parallele.
  2. Velocità di sviluppo maggiore in virtù del punto 1 e dal riutilizzo delle configurazioni adottate nelle applicazioni parallele.
  3. Maggiore economicità, creare un nuovo ambiente per un’applicazione comporta costi aggiuntivi per la manutenzione dell’instanza della piattaforma dedicata, suddivisi invece nell’ambiente condiviso.

Tra i punti di attenzione più importanti abbiamo:

  1. Configurazione puntuale degli utenti della piattaforma : per avere una giusta segregazione dei dati abbiamo bisogno di configurare puntualmente le modalità di accesso alla piattaforma, configurazione che può diventare costosa specialmente se non eseguita in precedenza.
  2. Bisogna prestare attenzione alle applicazioni preesistenti : gli sviluppatori devono essere formati a lavorare su una piattaforma condivisa affinché non effettuino modifiche incontrollate su elementi condivisi.

Arrivederci al prossimo articolo!

Bibliografia:

https://community.appian.com/w/the-appian-playbook/895/when-to-consider-exceptions-to-an-appian-shared-environment

https://docs.appian.com/suite/help/21.4/System_Requirements.html