26.04.2021

JSON-data SQL-tietokantaan – Azure vs BizTalk

Maailma siirtyy pikkuhiljaa BizTalkista Azureen. BizTalk-kehittäjänä minunkin täytyy myöntää, että tietyt asiat on helpompi toteuttaa Azuressa – ja vielä selvästi nopeammin kuin BizTalkissa.
Esimerkkitapaus: haetaan (ns. “pollataan”) JSON dataa APIsta ja tallennetaan siitä osa SQL-tietokantaan. Ns. ‘perinteisessä’ BizTalk-maailmassa toteutus menisi näin:
· Luodaan taulu tietokantaan
· Luodaan projekti, jossa on orkestraatio. Sillä haetaan dataa APIsta
· Lisätään JSON-XML muunnos (JSON receive pipeline)
· Lisätään XML-skeema (SQL-tietokannan table insert, generoitu adapterilla)
· Lähes aina tarvitaan vielä muunnos, jos SQL-taulun kenttien nimet ovat eri tai pelkkä arvojen siirto ei riitä vaan tarvitaan jotain lisälogiikkaa. Tässä tapauksessa arvot saavat mennä sellaisenaan tauluun.
· Lisäksi pitää konfiguroida erikseen porttien tiedot BizTalkin käyttöliittymässä.

Azuressa tämä onnistuu parhaimmillaan yhdellä Logic Appilla:
· Luodaan SQL-taulu (Azure SQL) tietokantaan
· Luodaan tallennettu proseduuri tietokantaan (tästä kohta lisää)
· Kutsutaan APIa, joko suoraan HTTP-toimintoon (action) tai vaihtoehtoisesti Azure API Managementin kautta, jos pääsy APIin on päätetty toteuttaa sen kautta (kuten tässä esimerkissä)
· JSON data syötetään suoraan “SQL server”- ”Execute stored procedure v2”-toimintoon
· Jos meillä on SQL yhteys jo käytössä, voidaan valita kaikki parametrit (SQL palvelimen nimi, tietokannan nimi, proseduurin nimi ja sen parametrit) alasvetolaatikosta

Varsinainen juju on kuitenkin tallennetussa proseduurissa:
· Siinä on yksi input-parametri (tyyppiä NVARCHAR(MAX) ), johon syötetään APIsta pollattu JSON data
· Proseduurin käyttämällä ”SELECT … FOR OPENJSON … WITH …” lauseella saadaan JSON datan arvot tietokantaan.
Alla proseduurin TSQL-esimerkkikoodi:

CREATE PROC [dbo].[sp_myFOObjectsMerge] (@json NVARCHAR(MAX) )
AS
BEGIN

WITH cte AS (
    --- all FO objects
   SELECT 
   [FOObjectName], 
   [Code], 
   [Name] 
	FROM OPENJSON ( @json, '$.results' )  
	WITH 
	(
             --- specify which json property
             [FOObjectName]	VARCHAR(100)  '$.__metadata.type',  
	     [Code]   VARCHAR(100)	'$.externalCode',  
	     [Name]    NVARCHAR(100)	'$.name'
	)
     )
 MERGE [dbo].[tbl_myFOObjects] TARGET
 USING cte SOURCE
 ON (TARGET.[Code] = SOURCE.[Code] AND TARGET.[FOObjectName]=SOURCE.[FOObjectName])
 (...)

END

Mikä on tässä tapauksessa Azuren toteutuksen hyöty verrattuna BizTalkiin? Ainakin vähemmän ”liikkuvia osia”:
· JSON->XML muunnos (json receive pipeline) jää pois
· Tietokannan XML-skeema jää pois
· Lisäksi ylläpito yksinkertaistuu: Jos tulee muutoksia APIn tai tietokantaan, riittää että tehdään tarvittavat muutokset SQL proseduuriin ja/tai tauluun.
· Myös testaaminen ja muokkaaminen on helpompaa, koska kehitysympäristössä ei tarvitse jokaisen muutoksen jälkeen ajaa asennusta (deployment) BizTalkille ja käynnistellä sen jälkeen prosesseja uusiksi.
· Testaamisessa auttaa myös se, että Logic Appsien käyttöliittymästä saa helposti poimittua mahdollisia virheitä aiheuttavan datan suoraan selaimen ikkunasta käsin tapahtuvaa jatkoselvitystä auttamaan, eikä virhettä/dataa tarvitse hakea BizTalkin lokimassan seasta.

Nämä asiat vielä korostuvat, kun katsotaan alkuperäisen BizTalk pollausratkaisun kokonaisuutta: listoja on yhden sijaan useampia ja niissä kaksi eri listatyyppiä – toisessa kaksi ja toisessa viisi eri listaa. Jokaiselle noista 7 noudosta on tehty oma BizTalk Send ja Receive -portti, ja Receive-puolelle on pitänyt konfiguroida mäppäys. Vastaava Azure Logic Apps ratkaisu voisi olla alla kuvattu ratkaisu:

· Pollattavien listojen urlit määritellään omassa arraysssa (tai array-parametrina).
· For-Each loopissa pollataan, ja lisätään dataa tietokantaan.
· Ainoa paikka joka vaatii muutoksia on tallennetun proseduurin koodit (jos logiikka on pollatusta listasta riippuvainen)

Koko ratkaisu on siis selvästi nopeammin laajennettavissa Azuressa kuin BizTalkissa.

INTEGRATE REMOTE 2021

Jos Azure-integraatiot kiinnostavat, niin INTEGRATE REMOTE 2021 -konferenssi lähestyy – Esa Vanhanen-Varho kirjoitti perusteluja yhdessä järjestäjien kanssa, miksi kannattaisi osallistua. Huhtikuun loppuun asti vielä alennettu Early Bird hinta. Lisäksi rekisteröinnin yhteydessä voit saada 20% alennuksen lipuista käyttämällä “INT2021-PARTNER-Bilot” koodia.

Share
Contact Person

Bloggaaja

Armin Züger

Consultant, Intelligent Enterprise