Mae cymuned datblygwyr .NET Raiffeisenbank yn parhau â'i throsolwg byr o ViennaNET. Dysgwch sut a pham y daethom i'r casgliad hwn. .
Yn yr erthygl hon, byddwn yn mynd dros rai llyfrgelloedd ar gyfer gweithio gyda thrafodion dosbarthedig, ciwiau a chronfeydd data nad ydynt wedi'u trafod eto, y gellir eu canfod yn ein storfa GitHub (), a .
ViennaNET.Sagas
Pan fydd prosiect yn newid i DDD a phensaernïaeth microwasanaethau, mae gwahanu rhesymeg fusnes ar draws gwahanol wasanaethau yn peri'r her o weithredu mecanwaith trafodion dosbarthedig, gan fod llawer o senarios yn aml yn rhychwantu sawl parth. Gallwch ddysgu mwy am y mecanweithiau hyn, er enghraifft, yn .
Yn ein prosiectau, fe wnaethom weithredu mecanwaith syml ond defnyddiol: saga, neu'n fwy manwl gywir, saga sy'n seiliedig ar gerddorfa. Dyma ei hanfod: mae senario busnes lle mae'n rhaid cyflawni gweithrediadau yn olynol ar draws gwahanol wasanaethau. Os bydd unrhyw broblemau'n codi ar unrhyw gam, rhaid galw gweithdrefn rholio'n ôl ar gyfer pob cam blaenorol lle darperir un. Felly, ar ddiwedd y saga, waeth beth fo'r llwyddiant, rydym yn cael data cyson ar draws pob parth.
Mae ein gweithrediad yn dal i fod yn sylfaenol iawn ac nid yw'n dibynnu ar unrhyw ryngweithiadau â gwasanaethau eraill. Mae'n hawdd ei ddefnyddio: etifeddu o'r dosbarth haniaethol sylfaenol SagaBase<T>, lle mae T yn eich dosbarth cyd-destun, a all storio'r data cychwynnol sydd ei angen ar gyfer y saga, yn ogystal â rhai canlyniadau canolradd. Bydd enghraifft cyd-destun yn cael ei throsglwyddo i bob cam yn ystod y gweithrediad. Mae'r saga ei hun yn ddosbarth di-wladwriaeth, felly gellir gosod enghraifft yn DI fel Singleton i gael y dibyniaethau angenrheidiol.
Enghraifft o hysbyseb:
public class ExampleSaga : SagaBase<ExampleContext>
{
public ExampleSaga()
{
Step("Step 1")
.WithAction(c => ...)
.WithCompensation(c => ...);
AsyncStep("Step 2")
.WithAction(async c => ...);
}
}
Galwad enghreifftiol:
var saga = new ExampleSaga();
var context = new ExampleContext();
await saga.Execute(context);
Gellir gweld enghreifftiau llawn o wahanol weithrediadau ac mewn cynulliad gyda .
ViennaNET.Orm.*
Set o lyfrgelloedd ar gyfer gweithio gyda chronfeydd data amrywiol drwy Nhibernate. Rydym yn defnyddio'r dull DB-First gyda Liquibase, felly dim ond ymarferoldeb ar gyfer gweithio gyda data mewn cronfa ddata sy'n bodoli eisoes sydd gan y llyfrgell hon.
ViennaNET.Orm.Seedwork и ViennaNET.Orm – prif gynulliadau sy'n cynnwys y rhyngwynebau sylfaenol a'u gweithrediadau, yn y drefn honno. Gadewch i ni archwilio eu cynnwys yn fanylach.
rhyngwyneb IEntityFactoryService a'i weithrediad EntityFactoryService yw'r prif fan cychwyn ar gyfer gweithio gyda'r gronfa ddata, gan eu bod yn creu Unedau Gwaith, ystorfeydd ar gyfer gweithio gydag endidau penodol, yn ogystal â gweithredwyr gorchmynion ac ymholiadau SQL uniongyrchol. Weithiau mae'n gyfleus cyfyngu ar alluoedd y dosbarth ar gyfer gweithio gyda'r gronfa ddata, er enghraifft, i ganiatáu darllen data yn unig. Ar gyfer achosion o'r fath, IEntityFactoryService mae rhyngwyneb hynafiad IEntityRepositoryFactory, sydd ond yn datgan dull ar gyfer creu ystorfeydd.
I gael mynediad uniongyrchol i'r gronfa ddata, rydym yn defnyddio mecanwaith darparwr. Mae gan bob DBMS a ddefnyddiwn yn ein timau ei weithrediad ei hun: ViennaNET.Orm.MSSQL, ViennaNET.Orm.Oracle, ViennaNET.Orm.SQLite, ViennaNET.Orm.PostgreSql.
Gellir cofrestru darparwyr lluosog ar yr un pryd mewn un cymhwysiad, gan ganiatáu, er enghraifft, mudo cam wrth gam o un DBMS i un arall o fewn un gwasanaeth heb unrhyw addasiadau i'r seilwaith. Mae'r mecanwaith ar gyfer dewis y cysylltiad gofynnol ac, o ganlyniad, y darparwr ar gyfer dosbarth endid penodol (y mae'r mapio i dablau DB wedi'i ysgrifennu ar ei gyfer) yn cael ei weithredu trwy gofrestru'r endid yn y dosbarth BoundedContext (sy'n cynnwys dull ar gyfer cofrestru endidau parth) neu ei olynydd, ApplicationContext (sy'n cynnwys dulliau ar gyfer cofrestru endidau cymhwysiad, ymholiadau uniongyrchol, a gorchmynion), lle mae'r dynodwr cysylltiad o'r ffurfweddiad yn cael ei dderbyn fel dadl:
"db": [
{
"nick": "mssql_connection",
"dbServerType": "MSSQL",
"ConnectionString": "...",
"useCallContext": true
},
{
"nick": "oracle_connection",
"dbServerType": "Oracle",
"ConnectionString": "..."
}
],
Cyd-destun Cais Enghraifft:
internal sealed class DbContext : ApplicationContext
{
public DbContext()
{
AddEntity<SomeEntity>("mssql_connection");
AddEntity<MigratedSomeEntity>("oracle_connection");
AddEntity<AnotherEntity>("oracle_connection");
}
}
Os na nodir ID y cysylltiad, defnyddir y cysylltiad o'r enw "diofyn".
Mae'r mapio gwirioneddol o endidau i dablau cronfa ddata yn cael ei weithredu gan ddefnyddio offer safonol NHibernate. Gallwch ddefnyddio ffeiliau XML a dosbarthiadau ar gyfer disgrifiadau. Mae llyfrgell ar gael ar gyfer ysgrifennu storfeydd stub yn gyfleus mewn profion uned. ViennaNET.TestUtils.Orm.
Mae enghreifftiau llawn o ddefnyddio ViennaNET.Orm.* i'w cael .
ViennaNET.Negeseuon.*
Set o lyfrgelloedd ar gyfer gweithio gyda chiwiau.
Ar gyfer gweithio gyda chiwiau, dewiswyd yr un dull ag a ddewiswyd gydag amrywiol DBMS, sef y dull mwyaf unedig posibl o ran gweithio gyda'r llyfrgell, waeth beth fo'r rheolwr ciw a ddefnyddir. ViennaNET.Messaging sy'n gyfrifol yn union am yr uno hwn, a ViennaNET.Messaging.MQSeriesQueue, ViennaNET.Messaging.RabbitMQQueue и ViennaNET.Messaging.KafkaQueue yn cynnwys gweithrediadau o addaswyr ar gyfer IBM MQ, RabbitMQ a Kafka, yn y drefn honno.
Mae dau broses wrth weithio gyda chiwiau: derbyn negeseuon a'u hanfon.
Gadewch i ni ystyried derbyn. Mae dau opsiwn yma: ar gyfer gwrando parhaus ac ar gyfer derbyn un neges. I wrando'n barhaus ar y ciw, rhaid i chi ddiffinio dosbarth prosesydd a etifeddwyd oddi wrthych yn gyntaf. IMessageProcessor, a fydd yn gyfrifol am brosesu'r neges sy'n dod i mewn. Nesaf, rhaid ei "gysylltu" â chiw penodol, a wneir trwy gofrestru yn IQueueReactorFactory gan nodi'r ID ciw o'r ffurfweddiad:
"messaging": {
"ApplicationName": "MyApplication"
},
"rabbitmq": {
"queues": [
{
"id": "myQueue",
"queuename": "lalala",
...
}
]
},
Enghraifft o ddechrau gwrando:
_queueReactorFactory.Register<MyMessageProcessor>("myQueue");
var queueReactor = queueReactorFactory.CreateQueueReactor("myQueue");
queueReactor.StartProcessing();
Yna, pan fydd y gwasanaeth yn cychwyn a bod y dull i ddechrau gwrando yn cael ei alw, bydd pob neges o'r ciw penodedig yn mynd i'r prosesydd cyfatebol.
I dderbyn un neges yn y ffatri rhyngwyneb IMessagingComponentFactory mae yna ddull CreateMessageReceiver, a fydd yn creu derbynnydd sy'n aros am neges o'r ciw a bennwyd iddo:
using (var receiver = _messagingComponentFactory.CreateMessageReceiver<TestMessage>("myQueue"))
{
var message = receiver.Receive();
}
I anfon neges mae angen i chi ddefnyddio'r un peth IMessagingComponentFactory a chreu anfonwr neges:
using (var sender = _messagingComponentFactory.CreateMessageSender<MyMessage>("myQueue"))
{
sender.SendMessage(new MyMessage { Value = ...});
}
Mae tri opsiwn parod ar gyfer cyfresoli a dad-gyfresoli negeseuon: testun plaen, XML, a JSON, ond os oes angen, gallwch chi greu eich gweithrediadau eich hun o'r rhyngwynebau yn hawdd. IMessageSerializer и IMessageDeserializer.
Rydym wedi ceisio cadw galluoedd unigryw pob rheolwr ciw, er enghraifft, ViennaNET.Messaging.MQSeriesQueue yn caniatáu ichi anfon nid yn unig negeseuon testun, ond negeseuon beit hefyd, a ViennaNET.Messaging.RabbitMQQueue Yn cefnogi llwybro a chreu ciw ar unwaith. Mae ein lapio addasydd ar gyfer RabbitMQ hefyd yn gweithredu rhywfaint o swyddogaethau RPC: rydym yn anfon neges ac yn aros am ymateb gan giw dros dro arbennig a grëwyd ar gyfer un neges ymateb yn unig.
Yma .
Cyd-destun Galwad ViennaNET
Rydym yn defnyddio ciwiau nid yn unig ar gyfer integreiddio rhwng gwahanol systemau ond hefyd ar gyfer cyfathrebu rhwng microwasanaethau o fewn un cymhwysiad, er enghraifft, o fewn saga. Roedd hyn yn golygu bod angen trosglwyddo data ategol ynghyd â negeseuon, megis mewngofnodi'r defnyddiwr, ID y cais ar gyfer logio o'r dechrau i'r diwedd, cyfeiriad IP y ffynhonnell, a data awdurdodi. I weithredu anfon y data hwn ymlaen, fe wnaethom ddatblygu llyfrgell. ViennaNET.CallContext, sy'n caniatáu storio data o gais sy'n dod i mewn i wasanaeth. Mae'n amherthnasol a wnaed y cais trwy giw neu drwy Http. Yna, cyn anfon y cais neu'r neges sy'n mynd allan, caiff y data ei dynnu o'r cyd-destun a'i osod yn y penawdau. Fel hyn, mae'r gwasanaeth nesaf yn derbyn y data ategol ac yn ei reoli'n debyg.
Diolch am eich sylw, edrychwn ymlaen at eich sylwadau a'ch ceisiadau tynnu!
Ffynhonnell: hab.com
