ViennaNET: ṣeto awọn ile-ikawe fun ẹhin. Apa keji

Agbegbe olupilẹṣẹ Raiffeisenbank .NET tẹsiwaju lati ṣe ayẹwo ni ṣoki awọn akoonu ti ViennaNET. Nipa bii ati idi ti a fi wa si eyi, o le ka apakan akọkọ.

Ninu nkan yii, a yoo lọ nipasẹ awọn ile-ikawe ti a ko le ṣe akiyesi fun ṣiṣẹ pẹlu awọn iṣowo pinpin, awọn ila ati awọn apoti isura data, eyiti o le rii ni ibi ipamọ GitHub wa (awọn orisun wa nibi), ṣugbọn Nuget jo nibi.

ViennaNET: ṣeto awọn ile-ikawe fun ẹhin. Apa keji

ViennaNET.Sagas

Nigbati iṣẹ akanṣe kan ba yipada si DDD ati faaji microservice, lẹhinna nigbati a pin ọgbọn iṣowo kọja awọn iṣẹ oriṣiriṣi, iṣoro kan dide ti o ni ibatan si iwulo lati ṣe ilana iṣowo pinpin, nitori ọpọlọpọ awọn oju iṣẹlẹ nigbagbogbo ni ipa lori awọn ibugbe pupọ ni ẹẹkan. O le faramọ iru awọn ọna ṣiṣe ni awọn alaye diẹ sii, fun apẹẹrẹ, ninu iwe "Microservices Awọn ilana", Chris Richardson.

Ninu awọn iṣẹ akanṣe wa, a ti ṣe imuse ilana ti o rọrun ṣugbọn iwulo: saga kan, tabi dipo saga ti o da lori orchestration. Koko-ọrọ rẹ jẹ atẹle yii: oju iṣẹlẹ iṣowo kan wa ninu eyiti o jẹ dandan lati ṣe awọn iṣẹ ṣiṣe lẹsẹsẹ ni awọn iṣẹ oriṣiriṣi, ati pe ti awọn iṣoro eyikeyi ba waye ni eyikeyi igbesẹ, o jẹ dandan lati pe ilana rollback fun gbogbo awọn igbesẹ ti tẹlẹ, nibiti o wa. pese. Nitorinaa, ni opin saga, laibikita aṣeyọri, a gba data deede ni gbogbo awọn ibugbe.

Awọn imuse wa tun ṣe ni fọọmu ipilẹ rẹ ati pe ko ni asopọ si lilo eyikeyi awọn ọna ti ibaraenisepo pẹlu awọn iṣẹ miiran. Ko ṣoro lati lo: o kan ṣe ọmọ-ara ti ipilẹ abọtẹlẹ kilasi SagaBase<T>, nibiti T jẹ kilasi ọrọ-ọrọ rẹ ninu eyiti o le fipamọ data akọkọ ti o ṣe pataki fun saga lati ṣiṣẹ, ati diẹ ninu awọn abajade agbedemeji. Apeere ti o tọ yoo kọja si gbogbo awọn igbesẹ lakoko ipaniyan. Saga funrararẹ jẹ kilasi ti ko ni ipinlẹ, nitorinaa a le gbe apẹẹrẹ si DI bi Singleton lati gba awọn igbẹkẹle to wulo.

Ipolowo apẹẹrẹ:

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

Ipe apẹẹrẹ:

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

Awọn apẹẹrẹ kikun ti awọn imuse oriṣiriṣi le ṣee wo nibi ati ni ijọ pẹlu igbeyewo.

ViennaNET.Orm.*

Eto awọn ile-ikawe fun ṣiṣẹ pẹlu ọpọlọpọ awọn apoti isura infomesonu nipasẹ Nhibernate. A lo ọna DB-First nipa lilo Liquibase, nitorinaa iṣẹ ṣiṣe nikan wa fun ṣiṣẹ pẹlu data ni ibi ipamọ data ti o ti ṣetan.

ViennaNET.Orm.Seedwork и ViennaNET.Orm - awọn apejọ akọkọ ti o ni awọn atọkun ipilẹ ati awọn imuse wọn, ni atele. Jẹ ki a wo awọn akoonu wọn ni awọn alaye diẹ sii.

ni wiwo IEntityFactoryService ati imuse rẹ EntityFactoryService jẹ aaye ibẹrẹ akọkọ fun ṣiṣẹ pẹlu data data, lati Ẹka Iṣẹ, awọn ibi ipamọ fun ṣiṣẹ pẹlu awọn ile-iṣẹ kan pato, ati awọn alaṣẹ ti awọn aṣẹ ati awọn ibeere SQL taara ni a ṣẹda nibi. Nigba miiran o rọrun lati ṣe idinwo awọn agbara ti kilasi kan fun ṣiṣẹ pẹlu data data, fun apẹẹrẹ, lati pese agbara lati ka data nikan. Fun iru awọn igba miran IEntityFactoryService baba kan wa - wiwo IEntityRepositoryFactory, eyi ti o sọ nikan ọna kan fun ṣiṣẹda awọn ibi ipamọ.

Lati wọle si ibi ipamọ data taara, ẹrọ olupese ti lo. Kọọkan DBMS ti a lo ninu awọn ẹgbẹ wa ni imuse tirẹ: ViennaNET.Orm.MSSQL, ViennaNET.Orm.Oracle, ViennaNET.Orm.SQLite, ViennaNET.Orm.PostgreSql.

Ni akoko kanna, ọpọlọpọ awọn olupese le forukọsilẹ ni ohun elo kan ni akoko kanna, eyiti o fun laaye, fun apẹẹrẹ, laarin ilana ti iṣẹ kan, laisi idiyele eyikeyi fun iyipada awọn amayederun, lati ṣe iṣilọ-ni-igbesẹ lati ọkan DBMS si miiran. Ilana fun yiyan asopọ ti o nilo ati, nitorinaa, olupese fun kilasi nkan kan pato (fun eyiti a ti kọ aworan agbaye si awọn tabili data) ni imuse nipasẹ fiforukọṣilẹ nkan naa ni kilasi BoundedContext (ni ọna kan fun iforukọsilẹ awọn ile-iṣẹ agbegbe) tabi arọpo rẹ Ohun eloContext (ni awọn ọna fun fiforukọṣilẹ awọn nkan elo, awọn ibeere taara ati awọn aṣẹ), nibiti a ti gba idanimọ asopọ lati iṣeto ni bi ariyanjiyan:

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

Ohun elo Apeere Opo:

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

Ti ID asopọ ko ba ni pato, lẹhinna asopọ ti a npè ni “aiyipada” yoo ṣee lo.

Aworan agbaye taara ti awọn nkan si awọn tabili data jẹ imuse ni lilo awọn irinṣẹ NHibernate boṣewa. O le lo apejuwe naa nipasẹ awọn faili xml ati nipasẹ awọn kilasi. Fun kikọ irọrun ti awọn ibi ipamọ stub ni awọn idanwo Unit, ile-ikawe kan wa ViennaNET.TestUtils.Orm.

Awọn apẹẹrẹ kikun ti lilo ViennaNET.Orm.* ni a le rii nibi.

ViennaNET.Fifiranṣẹ.*

Eto ti awọn ile-ikawe fun ṣiṣẹ pẹlu awọn isinyi.

Lati ṣiṣẹ pẹlu awọn ila, ọna kanna ni a yan gẹgẹbi pẹlu ọpọlọpọ awọn DBMS, eyun, ọna iṣọkan ti o pọju ti o ṣeeṣe ni awọn ofin ti ṣiṣẹ pẹlu ile-ikawe, laibikita oluṣakoso isinyi ti a lo. Ile-ikawe ViennaNET.Messaging jẹ gbọgán lodidi fun yi isokan, ati ViennaNET.Messaging.MQSeriesQueue, ViennaNET.Messaging.RabbitMQQueue и ViennaNET.Messaging.KafkaQueue ni awọn imuse ohun ti nmu badọgba fun IBM MQ, RabbitMQ ati Kafka, lẹsẹsẹ.

Nigbati o ba n ṣiṣẹ pẹlu awọn ila, awọn ilana meji wa: gbigba ifiranṣẹ ati fifiranṣẹ.

Gbero gbigba. Awọn aṣayan 2 wa nibi: fun gbigbọ tẹsiwaju ati fun gbigba ifiranṣẹ kan. Lati tẹtisi isinyi nigbagbogbo, o gbọdọ kọkọ ṣapejuwe kilasi ero isise ti jogun lati IMessageProcessor, eyi ti yoo jẹ iduro fun sisẹ ifiranṣẹ ti nwọle. Nigbamii ti, o gbọdọ jẹ “isopọ” si isinyi kan pato; eyi ni a ṣe nipasẹ iforukọsilẹ ni IQueueReactorFactory nfihan idamo isinyi lati iṣeto:

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

Apẹẹrẹ ti ibẹrẹ gbigbọ:

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

Lẹhinna, nigbati iṣẹ naa ba bẹrẹ ati pe ọna ti a pe lati bẹrẹ gbigbọ, gbogbo awọn ifiranṣẹ lati isinyi ti a ti sọtọ yoo lọ si ero isise ti o baamu.

Lati gba ifiranṣẹ kan wọle ni wiwo ile-iṣẹ kan IMessagingComponentFactory ọna kan wa CreateMessageReceivereyi ti yoo ṣẹda olugba ti nduro fun ifiranṣẹ lati ori isinyi ti a sọ si rẹ:

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

Lati fi ifiranṣẹ ranṣẹ o nilo lati lo kanna IMessagingComponentFactory ki o si ṣẹda olufiranṣẹ:

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

Awọn aṣayan mẹta ti a ti ṣe fun isọdọkan ati sisọ ifiranṣẹ kan wa: ọrọ kan, XML ati JSON, ṣugbọn ti o ba jẹ dandan, o le ni rọọrun ṣe awọn imuse wiwo tirẹ. IMessageSerializer и IMessageDeserializer.

A ti gbiyanju lati tọju awọn agbara alailẹgbẹ ti oluṣakoso isinyi kọọkan, fun apẹẹrẹ. ViennaNET.Messaging.MQSeriesQueue faye gba o lati fi ko nikan ọrọ, sugbon tun baiti awọn ifiranṣẹ, ati ViennaNET.Messaging.RabbitMQQueue atilẹyin afisona ati lori-ni-fly queuing. Ohun ti nmu badọgba ti nmu badọgba fun RabbitMQ tun ṣe imuse diẹ ninu irisi RPC: a fi ifiranṣẹ ranṣẹ ati duro fun esi lati isinyi igba diẹ pataki, eyiti o ṣẹda fun ifiranṣẹ esi kan nikan.

Nibi apẹẹrẹ ti lilo awọn ila pẹlu awọn nuances asopọ ipilẹ.

ViennaNET.CallContext

A lo awọn ila kii ṣe fun iṣọpọ laarin awọn ọna ṣiṣe oriṣiriṣi, ṣugbọn tun fun ibaraẹnisọrọ laarin awọn iṣẹ microservices ti ohun elo kanna, fun apẹẹrẹ, laarin saga kan. Eyi yori si iwulo lati tan kaakiri pẹlu ifiranṣẹ bii data iranlọwọ bi iwọle olumulo, idanimọ ibeere fun gedu ipari-si-opin, adiresi IP orisun ati data aṣẹ. Lati ṣe ifiranšẹ siwaju ti data yii, a ṣe agbekalẹ ile-ikawe kan ViennaNET.CallContext, eyiti o fun ọ laaye lati tọju data lati inu ibeere ti nwọle iṣẹ naa. Ni ọran yii, bii o ṣe ṣe ibeere naa, nipasẹ isinyi tabi nipasẹ Http, ko ṣe pataki. Lẹhinna, ṣaaju fifiranṣẹ ibeere ti njade tabi ifiranṣẹ, a mu data lati inu ọrọ-ọrọ ati gbe sinu awọn akọle. Nitorinaa, iṣẹ atẹle gba data iranlọwọ ati ṣakoso rẹ ni ọna kanna.

O ṣeun fun akiyesi rẹ, a nireti awọn asọye rẹ ati fa awọn ibeere!

orisun: www.habr.com

Fi ọrọìwòye kun