Umphakathi wonjiniyela we-Raiffeisenbank .NET uyaqhubeka nokubuyekeza kafushane okuqukethwe kwe-ViennaNET. Mayelana nokuthi sifike kanjani kulokhu futhi kungani,
Kulesi sihloko, sizodlula emitapweni yolwazi esazocatshangelwa ukuze sisebenze ngokuthengiselana okusabalalisiwe, imigqa kanye nemininingwane yolwazi, engatholakala kunqolobane yethu ye-GitHub (
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,
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
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
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 CreateMessageReceiver
okuzodala 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
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