Jumuiya ya wasanidi programu wa .NET ya Raiffeisenbank inaendelea na muhtasari wake mfupi wa ViennaNET. Jifunze jinsi na kwa nini tulifikia hitimisho hili. .
Katika makala haya, tutaangalia baadhi ya maktaba za kufanya kazi na miamala iliyosambazwa, foleni, na hifadhidata ambazo hazijashughulikiwa bado, na ambazo zinaweza kupatikana katika hazina yetu ya GitHub (), na .
ViennaNET.Sagas
Mradi unapobadilika hadi DDD na usanifu wa huduma ndogo, mgawanyo wa mantiki ya biashara katika huduma tofauti huleta changamoto ya kutekeleza utaratibu wa miamala iliyosambazwa, kwani hali nyingi mara nyingi huhusisha vikoa vingi. Unaweza kujifunza zaidi kuhusu mifumo hii, kwa mfano, katika .
Katika miradi yetu, tulitekeleza utaratibu rahisi lakini muhimu: sakata, au kwa usahihi zaidi, sakata inayotegemea mpangilio. Kiini chake ni kama ifuatavyo: kuna hali ya biashara ambapo shughuli lazima zifanyike mfululizo katika huduma tofauti. Ikiwa matatizo yoyote yatatokea katika hatua yoyote, utaratibu wa kurudi nyuma lazima uitwe kwa hatua zote za awali ambapo moja hutolewa. Kwa hivyo, mwishoni mwa sakata, bila kujali mafanikio, tunapata data thabiti katika nyanja zote.
Utekelezaji wetu bado ni wa msingi sana na hautegemei mwingiliano wowote na huduma zingine. Ni rahisi kutumia: kurithi tu kutoka kwa darasa la msingi la dhahania la SagaBase<T>, ambapo T ni darasa lako la muktadha, ambalo linaweza kuhifadhi data ya awali inayohitajika kwa sakata, pamoja na matokeo ya kati. Mfano wa muktadha utapitishwa kwa hatua zote wakati wa utekelezaji. Sakata lenyewe ni darasa lisilo na utambulisho, kwa hivyo mfano unaweza kuwekwa katika DI kama Singleton ili kupata utegemezi unaohitajika.
Mfano wa tangazo:
public class ExampleSaga : SagaBase<ExampleContext>
{
public ExampleSaga()
{
Step("Step 1")
.WithAction(c => ...)
.WithCompensation(c => ...);
AsyncStep("Step 2")
.WithAction(async c => ...);
}
}
Simu ya mfano:
var saga = new ExampleSaga();
var context = new ExampleContext();
await saga.Execute(context);
Mifano kamili ya utekelezaji tofauti inaweza kutazamwa na katika mkutano na .
ViennaNET.Orm.*
Seti ya maktaba za kufanya kazi na hifadhidata mbalimbali kupitia Nhibernate. Tunatumia mbinu ya DB-First na Liquibase, kwa hivyo maktaba hii inajumuisha tu utendaji kazi wa kufanya kazi na data katika hifadhidata iliyopo.
ViennaNET.Orm.Seedwork и ViennaNET.Orm – mikusanyiko mikuu yenye violesura vya msingi na utekelezaji wake, mtawalia. Hebu tuchunguze maudhui yake kwa undani zaidi.
interface IEntityFactoryService na utekelezaji wake EntityFactoryService ndio sehemu kuu ya kuanzia kufanya kazi na hifadhidata, kwani huunda Vitengo vya Kazi, hazina za kufanya kazi na vyombo maalum, pamoja na watekelezaji wa amri na maswali ya moja kwa moja ya SQL. Wakati mwingine ni rahisi kupunguza uwezo wa darasa kufanya kazi na hifadhidata, kwa mfano, kuruhusu usomaji wa data pekee. Kwa hali kama hizo, IEntityFactoryService kuna kiolesura cha babu IEntityRepositoryFactory, ambayo inatangaza tu njia ya kuunda hazina.
Ili kufikia hifadhidata moja kwa moja, tunatumia utaratibu wa mtoa huduma. Kila DBMS tunayotumia katika timu zetu ina utekelezaji wake: ViennaNET.Orm.MSSQL, ViennaNET.Orm.Oracle, ViennaNET.Orm.SQLite, ViennaNET.Orm.PostgreSql.
Watoa huduma wengi wanaweza kusajiliwa kwa wakati mmoja katika programu moja, kuruhusu, kwa mfano, uhamishaji wa hatua kwa hatua kutoka DBMS moja hadi nyingine ndani ya huduma moja bila marekebisho yoyote ya miundombinu. Utaratibu wa kuchagua muunganisho unaohitajika na, kwa hivyo, mtoa huduma wa darasa maalum la chombo (ambalo uunganishaji wa jedwali la DB umeandikwa) unatekelezwa kwa kusajili chombo katika darasa la BoundedContext (ambalo lina mbinu ya kusajili vyombo vya kikoa) au mrithi wake, ApplicationContext (ambayo ina mbinu za kusajili vyombo vya programu, maswali ya moja kwa moja, na amri), ambapo kitambulisho cha muunganisho kutoka kwa usanidi kinakubaliwa kama hoja:
"db": [
{
"nick": "mssql_connection",
"dbServerType": "MSSQL",
"ConnectionString": "...",
"useCallContext": true
},
{
"nick": "oracle_connection",
"dbServerType": "Oracle",
"ConnectionString": "..."
}
],
Mfano wa Muktadha wa Maombi:
internal sealed class DbContext : ApplicationContext
{
public DbContext()
{
AddEntity<SomeEntity>("mssql_connection");
AddEntity<MigratedSomeEntity>("oracle_connection");
AddEntity<AnotherEntity>("oracle_connection");
}
}
Ikiwa kitambulisho cha muunganisho hakijabainishwa, muunganisho unaoitwa "chaguo-msingi" utatumika.
Uchoraji halisi wa vyombo kwenye jedwali la hifadhidata unatekelezwa kwa kutumia zana za kawaida za NHibernate. Unaweza kutumia faili za XML na madarasa kwa maelezo. Maktaba inapatikana kwa ajili ya kuandika kwa urahisi hazina za vipande katika majaribio ya vitengo. ViennaNET.TestUtils.Orm.
Mifano kamili ya kutumia ViennaNET.Orm.* inaweza kupatikana .
Ujumbe wa ViennaNET.*
Seti ya maktaba za kufanya kazi na foleni.
Kwa kufanya kazi na foleni, mbinu ile ile ilichaguliwa kama ilivyo kwa DBMS mbalimbali, yaani, mbinu iliyounganishwa zaidi katika suala la kufanya kazi na maktaba, bila kujali meneja wa foleni aliyetumika. ViennaNET.Messaging ndiye anayehusika haswa na muungano huu, na ViennaNET.Messaging.MQSeriesQueue, ViennaNET.Messaging.RabbitMQQueue и ViennaNET.Messaging.KafkaQueue zinajumuisha utekelezaji wa adapta za IBM MQ, RabbitMQ na Kafka, mtawalia.
Kuna michakato miwili katika kufanya kazi na foleni: kupokea ujumbe na kuutuma.
Hebu tufikirie kupokea. Kuna chaguzi mbili hapa: kwa kusikiliza mfululizo na kwa kupokea ujumbe mmoja. Ili kusikiliza mfululizo kwenye foleni, lazima kwanza ubainishe darasa la kichakataji lililorithiwa kutoka IMessageProcessor, ambayo itakuwa na jukumu la kuchakata ujumbe unaoingia. Kisha, lazima "uunganishwe" na foleni maalum, ambayo hufanywa kwa kujiandikisha katika IQueueReactorFactory kubainisha kitambulisho cha foleni kutoka kwa usanidi:
"messaging": {
"ApplicationName": "MyApplication"
},
"rabbitmq": {
"queues": [
{
"id": "myQueue",
"queuename": "lalala",
...
}
]
},
Mfano wa kuanza kusikiliza:
_queueReactorFactory.Register<MyMessageProcessor>("myQueue");
var queueReactor = queueReactorFactory.CreateQueueReactor("myQueue");
queueReactor.StartProcessing();
Kisha, huduma inapoanza na njia ya kuanza kusikiliza inapoitwa, jumbe zote kutoka kwenye foleni iliyotajwa zitaenda kwa kichakataji kinacholingana.
Kupokea ujumbe mmoja katika kiwanda cha kiolesura IMessagingComponentFactory kuna mbinu CreateMessageReceiver, ambayo itaunda kipokeaji kinachosubiri ujumbe kutoka kwa foleni iliyoainishwa kwake:
using (var receiver = _messagingComponentFactory.CreateMessageReceiver<TestMessage>("myQueue"))
{
var message = receiver.Receive();
}
Kutuma ujumbe unahitaji kutumia vivyo hivyo IMessagingComponentFactory na unda mtumaji wa ujumbe:
using (var sender = _messagingComponentFactory.CreateMessageSender<MyMessage>("myQueue"))
{
sender.SendMessage(new MyMessage { Value = ...});
}
Kuna chaguo tatu zilizotengenezwa tayari za kuweka ujumbe mfululizo na kuondoa uandishi wa serial: maandishi wazi, XML, na JSON, lakini ikiwa ni lazima, unaweza kuunda kwa urahisi utekelezaji wako mwenyewe wa violesura. IMessageSerializer и IMessageDeserializer.
Tumejaribu kuhifadhi uwezo wa kipekee wa kila meneja wa foleni, kwa mfano, ViennaNET.Messaging.MQSeriesQueue hukuruhusu kutuma sio tu ujumbe mfupi wa maandishi, lakini pia ujumbe wa baiti, na ViennaNET.Messaging.RabbitMQQueue Inasaidia uelekezaji na uundaji wa foleni wakati wowote. Kifungashio chetu cha adapta cha RabbitMQ pia hutekeleza baadhi ya utendaji wa RPC: tunatuma ujumbe na kusubiri jibu kutoka kwa foleni maalum ya muda iliyoundwa kwa ajili ya ujumbe mmoja tu wa majibu.
Hapa .
ViennaNET.CallContext
Tunatumia foleni si tu kwa ajili ya ujumuishaji kati ya mifumo tofauti bali pia kwa mawasiliano kati ya huduma ndogo ndogo ndani ya programu moja, kwa mfano, ndani ya sakata. Hii ilihitaji uwasilishaji wa data saidizi pamoja na ujumbe, kama vile kuingia kwa mtumiaji, kitambulisho cha ombi la kumbukumbu kutoka mwanzo hadi mwisho, anwani ya IP chanzo, na data ya idhini. Ili kutekeleza usambazaji wa data hii, tuliunda maktaba. ViennaNET.CallContext, ambayo inaruhusu kuhifadhi data kutoka kwa ombi linaloingia hadi huduma. Ikiwa ombi lilifanywa kupitia foleni au kupitia Http halina umuhimu. Kisha, kabla ya kutuma ombi au ujumbe unaotoka, data hutolewa kutoka kwa muktadha na kuwekwa kwenye vichwa vya habari. Kwa njia hii, huduma inayofuata hupokea data saidizi na kuisimamia vivyo hivyo.
Asante kwa umakini wako, tunatarajia maoni yako na maombi yako ya kuvuta!
Chanzo: mapenzi.com
