I-ViennaNET: iqoqo lemitapo yolwazi ye-backend. Ingxenye 2

Umphakathi wonjiniyela we-Raiffeisenbank .NET uyaqhubeka nokubuyekeza kafushane okuqukethwe kwe-ViennaNET. Mayelana nokuthi sifike kanjani kulokhu futhi kungani, ungafunda ingxenye yokuqala.

Kulesi sihloko, sizodlula emitapweni yolwazi esazocatshangelwa ukuze sisebenze ngokuthengiselana okusabalalisiwe, imigqa kanye nemininingwane yolwazi, engatholakala kunqolobane yethu ye-GitHub (imithombo ilapha), futhi Amaphakheji we-Nuget lapha.

I-ViennaNET: iqoqo lemitapo yolwazi ye-backend. Ingxenye 2

I-ViennaNET.Sagas

Uma iphrojekthi ishintshela ku-DDD kanye ne-microservice architecture, khona-ke lapho ingqondo yebhizinisi isatshalaliswa kumasevisi ahlukene, inkinga ivela ehlobene nesidingo sokuqalisa indlela yokuthengiselana esabalalisiwe, ngoba izimo eziningi ngokuvamile zithinta izizinda ezimbalwa ngesikhathi esisodwa. Ungakwazi ukujwayelana nezinqubo ezinjalo ngokuningiliziwe, isibonelo, encwadini ethi "Microservices Patterns", Chris Richardson.

Kumaphrojekthi ethu, sisebenzise indlela elula kodwa ewusizo: i-saga, noma i-saga esekelwe ku-orchestration. Ingqikithi yayo ilandelayo: kunesimo esithile sebhizinisi lapho kudingekile ukwenza imisebenzi ngokulandelana kwezinsizakalo ezahlukene, futhi uma izinkinga ziphakama nganoma yisiphi isinyathelo, kuyadingeka ukubiza inqubo yokubuyela emuva kuzo zonke izinyathelo zangaphambilini, lapho enikeziwe. Ngakho, ekupheleni kwe-saga, kungakhathaliseki ukuthi impumelelo, sithola idatha engaguquki kuzo zonke izizinda.

Ukuqaliswa kwethu kusakwenziwa ngendlela eyisisekelo futhi akuboshelwe ekusetshenzisweni kwanoma yiziphi izindlela zokuxhumana nezinye izinsiza. Akunzima ukusebenzisa: vele wenze inzalo yesisekelo sekilasi le-abstract SagaBase<T>, lapho u-T kuyisigaba sakho somongo lapho ungagcina khona idatha yokuqala edingekayo ukuze i-saga isebenze, kanye neminye imiphumela emaphakathi. Isibonelo somongo sizodluliselwa kuzo zonke izinyathelo ngesikhathi sokwenza. I-Saga ngokwayo iyisigaba esingenasisekelo, ngakho-ke isibonelo singafakwa ku-DI njenge-Singleton ukuze uthole ukuncika okudingekayo.

Isibonelo sesikhangiso:

public class ExampleSaga : SagaBase<ExampleContext>
{
  public ExampleSaga()
  {
    Step("Step 1")
      .WithAction(c => ...)
      .WithCompensation(c => ...);
	
    AsyncStep("Step 2")
      .WithAction(async c => ...);
  }
}

Ucingo lwesibonelo:

var saga = new ExampleSaga();
var context = new ExampleContext();
await saga.Execute(context);

Izibonelo ezigcwele zokusetshenziswa okuhlukene zingabukwa lapha nasekuhlanganeni nge izivivinyo.

I-ViennaNET.Orm.*

Iqoqo lemitapo yolwazi yokusebenza nezizindalwazi ezahlukahlukene nge-Nhibernate. Sisebenzisa indlela ye-DB-First sisebenzisa i-Liquibase, ngakho-ke kunokusebenza kuphela kokusebenza nedatha kusizindalwazi esenziwe ngomumo.

ViennaNET.Orm.Seedwork и ViennaNET.Orm - imihlangano emikhulu equkethe izixhumanisi eziyisisekelo kanye nokusebenza kwazo, ngokulandelana. Ake sibheke okuqukethwe kwabo ngokuningiliziwe.

isikhombikubona IEntityFactoryService kanye nokuqaliswa kwayo EntityFactoryService ziyisiqalo esiyinhloko sokusebenza nesizindalwazi, njengoba Iyunithi Yomsebenzi, amakhosholo okusebenza nezinhlangano ezithile, kanye nababulali bemiyalo kanye nemibuzo eqondile ye-SQL yakhelwe lapha. Ngezinye izikhathi kulula ukukhawulela amakhono ekilasi okusebenza nesizindalwazi, isibonelo, ukunikeza ikhono lokufunda idatha kuphela. Ezimweni ezinjalo IEntityFactoryService kukhona idlozi - interface IEntityRepositoryFactory, ememezela kuphela indlela yokudala amaqoqo.

Ukufinyelela ngokuqondile kusizindalwazi, kusetshenziswa indlela yomhlinzeki. I-DBMS ngayinye esiyisebenzisayo emaqenjini ethu inokusebenzisa kwayo: ViennaNET.Orm.MSSQL, ViennaNET.Orm.Oracle, ViennaNET.Orm.SQLite, ViennaNET.Orm.PostgreSql.

Ngesikhathi esifanayo, abahlinzeki abaningana bangabhaliswa kuhlelo lokusebenza olulodwa ngesikhathi esifanayo, okuvumela, isibonelo, ngaphakathi kohlaka lwenkonzo eyodwa, ngaphandle kwezindleko zokushintsha ingqalasizinda, ukwenza ukufuduka kwesinyathelo ngesinyathelo i-DBMS eyodwa iye kwenye. Indlela yokukhetha uxhumano oludingekayo, ngakho-ke, umhlinzeki wekilasi lebhizinisi elithile (okubhalwa lona ukumaka amathebula esizindalwazi) isetshenziswa ngokubhalisa ibhizinisi esigabeni se-BoundedContext (iqukethe indlela yokubhalisa amabhizinisi esizinda) noma umlandeli wayo. I-ApplicationContext (iqukethe izindlela zokubhalisa amabhizinisi ezicelo , izicelo eziqondile nemiyalo), lapho isihlonzi sokuxhuma esisuka ekucushweni samukelwe njengengxabano:

"db": [
  {
    "nick": "mssql_connection",
    "dbServerType": "MSSQL",
    "ConnectionString": "...",
    "useCallContext": true
  },
  {
    "nick": "oracle_connection",
    "dbServerType": "Oracle",
    "ConnectionString": "..."
  }
],

Isibonelo sokuqukethwe kwesicelo:

internal sealed class DbContext : ApplicationContext
{
  public DbContext()
  {
    AddEntity<SomeEntity>("mssql_connection");
    AddEntity<MigratedSomeEntity>("oracle_connection");
    AddEntity<AnotherEntity>("oracle_connection");
  }
}

Uma i-ID yokuxhuma ingacacisiwe, uxhumano olubizwa ngokuthi "okuzenzakalelayo" luzosetshenziswa.

Ukuhlelwa kwemephu okuqondile kwezinhlangano kumathebula esizindalwazi kwenziwa kusetshenziswa amathuluzi ajwayelekile e-NHibernate. Ungasebenzisa incazelo kokubili ngamafayela e-xml nangamakilasi. Ukuze kubhalwe kalula amakhosombe we-stub ekuhlolweni kweyunithi, kukhona umtapo wezincwadi ViennaNET.TestUtils.Orm.

Izibonelo ezigcwele zokusebenzisa i-ViennaNET.Orm.* zingatholakala lapha.

I-ViennaNET.Imiyalezo.*

Iqoqo lemitapo yolwazi yokusebenza nolayini.

Ukuze kusetshenzwe ngolayini, kwakhethwa indlela efanayo njengakuma-DBMS ahlukahlukene, okungukuthi, indlela ehlangene engenzeka kakhulu ngokusebenza nomtapo wolwazi, kungakhathaliseki ukuthi umphathi wolayini osetshenzisiwe. Umtapowolwazi ViennaNET.Messaging unesibopho ngqo salokhu kubumbana, futhi ViennaNET.Messaging.MQSeriesQueue, ViennaNET.Messaging.RabbitMQQueue и ViennaNET.Messaging.KafkaQueue ziqukethe ukusetshenziswa kwe-adaptha ye-IBM MQ, RabbitMQ ne-Kafka, ngokulandelanayo.

Lapho usebenza nolayini, kunezinqubo ezimbili: ukuthola umlayezo nokuwuthumela.

Cabangela ukwamukela. Kunezinketho ezi-2 lapha: zokulalela okuqhubekayo nokwamukela umlayezo owodwa. Ukuze uhlale ulalela ulayini, kufanele uqale uchaze ikilasi lokucubungula ozuzwe njengefa IMessageProcessor, okuzoba nesibopho sokucubungula umlayezo ongenayo. Okulandelayo, kufanele "kuxhunywe" kulayini othile; lokhu kwenziwa ngokubhalisa ku IQueueReactorFactory okubonisa isihlonzi somugqa kusukela ekucushweni:

"messaging": {
    "ApplicationName": "MyApplication"
},
"rabbitmq": {
    "queues": [
      {
        "id": "myQueue",
        "queuename": "lalala",
        ...
      }
    ]
},

Isibonelo sokuqala ukulalela:

_queueReactorFactory.Register<MyMessageProcessor>("myQueue");
var queueReactor = queueReactorFactory.CreateQueueReactor("myQueue");
queueReactor.StartProcessing();

Khona-ke, lapho isevisi iqala futhi indlela ibizwa ukuthi iqale ukulalela, yonke imilayezo evela kulayini oshiwo izoya kuphrosesa ehambisanayo.

Ukwamukela umlayezo owodwa kusixhumi esibonakalayo sefekthri IMessagingComponentFactory kukhona indlela CreateMessageReceiverokuzodala umamukeli olinde umlayezo ovela kulayini oshiwo kuwo:

using (var receiver = _messagingComponentFactory.CreateMessageReceiver<TestMessage>("myQueue"))
{
    var message = receiver.Receive();
}

Ukuthumela umlayezo udinga ukusebenzisa okufanayo IMessagingComponentFactory bese udala umthumeli womlayezo:

using (var sender = _messagingComponentFactory.CreateMessageSender<MyMessage>("myQueue"))
{
    sender.SendMessage(new MyMessage { Value = ...});
}

Kunezinketho ezintathu esezilungele ukwenza i-serializing kanye nokususa umlayezo: umbhalo nje, i-XML ne-JSON, kodwa uma kunesidingo, ungenza kalula ukusebenzisa kwakho isixhumi esibonakalayo. IMessageSerializer и IMessageDeserializer.

Sizamile ukulondoloza amakhono ayingqayizivele omphathi womugqa ngamunye, isb. ViennaNET.Messaging.MQSeriesQueue ikuvumela ukuthi uthumele hhayi kuphela umbhalo, kodwa futhi nemiyalezo ye-byte, kanye ViennaNET.Messaging.RabbitMQQueue isekela umzila kanye nomugqa wokundiza. Isisonga sethu se-adaptha se-RabbitMQ siphinde sisebenzisa uhlobo oluthile lwe-RPC: sithumela umlayezo bese silinda impendulo evela kumugqa wesikhashana okhethekile, owakhelwe umlayezo owodwa wokuphendula kuphela.

Lapha isibonelo sokusebenzisa imigqa enama-nuances ayisisekelo okuxhumana.

I-ViennaNET.CallContext

Asisebenzisi imigqa hhayi kuphela ekuhlanganiseni phakathi kwamasistimu ahlukene, kodwa futhi ekuxhumaneni phakathi kwama-microservices ohlelo olufanayo, isibonelo, ngaphakathi kwesaga. Lokhu kuholele esidingweni sokudlulisa kanye nomlayezo idatha eyisekelayo njengokungena ngemvume komsebenzisi, ukucela isihlonzi sokugawulwa kwemithi kusukela ekupheleni, ikheli le-IP eliwumthombo kanye nedatha yokugunyazwa. Ukuze kusetshenziswe ukudluliselwa kwale datha, sithuthukise umtapo wolwazi ViennaNET.CallContext, okukuvumela ukuthi ugcine idatha kusuka kusicelo sokufaka isevisi. Kulokhu, ukuthi isicelo senziwe kanjani, ngomugqa noma nge-Http, akunandaba. Bese, ngaphambi kokuthumela isicelo esiphumayo noma umlayezo, idatha ithathwa kumongo futhi ibekwe kuzihloko. Ngakho, isevisi elandelayo ithola idatha eyisizayo futhi iyiphathe ngendlela efanayo.

Siyabonga ngokunaka kwakho, sibheke ngabomvu ukuphawula kwakho nokudonsa izicelo!

Source: www.habr.com

Engeza amazwana