ViennaNET: he pūʻulu hale waihona puke no ka hope. Mahele 2

Ke hoʻomau nei ka hui hoʻomohala ʻo Raiffeisenbank .NET e nānā pōkole i nā mea o ViennaNET. No ke aha a me ke kumu i hele mai ai mākou i kēia, hiki iā ʻoe ke heluhelu i ka hapa mua.

Ma kēia ʻatikala, e hele mākou i loko o nā hale waihona puke e noʻonoʻo ʻia no ka hana ʻana me nā kālepa i hoʻokaʻawale ʻia, nā queues a me nā ʻikepili, hiki ke loaʻa i kā mākou waihona GitHub (Aia nā kumu ma aneʻi), aii Nā pūʻolo Nuget maanei.

ViennaNET: he pūʻulu hale waihona puke no ka hope. Mahele 2

ViennaNET.Sagas

Ke hoʻololi ʻia kahi papahana i ka DDD a me ka hoʻolālā microservice, a laila i ka wā e puʻunaue ʻia ai ka loiloi ʻoihana ma nā lawelawe like ʻole, e kū mai kahi pilikia e pili ana i ka pono e hoʻokō i kahi mīkini hoʻoili mahele, no ka mea he nui nā hiʻohiʻona e hoʻopili pinepine i kekahi mau kikowaena i ka manawa hoʻokahi. Hiki iā ʻoe ke hoʻomaʻamaʻa me ia mau mīkini i nā kikoʻī hou aku, no ka laʻana, ma ka puke "Microservices Patterns", Chris Richardson.

Ma kā mākou mau papahana, ua hoʻokō mākou i kahi hana maʻalahi akā pono: he saga, a i ʻole he saga hoʻokumu ʻia o ka orchestration. ʻO kāna kumu: aia kekahi ʻano ʻoihana e pono ai e hana i nā hana ma nā lawelawe like ʻole, a inā e kū mai kekahi pilikia i kēlā me kēia ʻanuʻu, pono ia e kāhea i ke kaʻina hana rollback no nā ʻanuʻu mua a pau, kahi i loaʻa ai. hāʻawi ʻia. No laila, i ka hopena o ka saga, me ka nānā ʻole i ka kūleʻa, loaʻa iā mākou ka ʻikepili maʻamau i nā kikowaena āpau.

Hana ʻia kā mākou hoʻokō ma kona ʻano kumu a ʻaʻole pili i ka hoʻohana ʻana i kekahi ʻano o ka launa pū ʻana me nā lawelawe ʻē aʻe. ʻAʻole paʻakikī ke hoʻohana: e hana wale i ka moʻopuna o ka papa abstract kumu SagaBase, kahi ʻo T kāu papa pōʻaiapili kahi e hiki ai iā ʻoe ke mālama i ka ʻikepili mua e pono ai ka hana o ka saga, a me kekahi mau hopena waena. E hāʻawi ʻia ka laʻana pōʻaiapili i nā ʻanuʻu āpau i ka wā e hoʻokō ai. He papa mokuʻāina ʻo Saga ponoʻī, no laila hiki ke waiho ʻia ka hiʻohiʻona ma DI ma ke ʻano he Singleton e kiʻi i nā hilinaʻi pono.

Laʻana hoʻolaha:

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

Kahea laʻana:

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

Hiki ke nānā ʻia nā hiʻohiʻona piha o nā hoʻokō like ʻole maanei a i ka hui ana me nā hoʻāʻo.

ViennaNET.Orm.*

He pūʻulu waihona no ka hana ʻana me nā ʻikepili like ʻole ma o Nhibernate. Hoʻohana mākou i ke ala DB-First me ka hoʻohana ʻana iā Liquibase, no laila aia wale nō ka hana no ka hana ʻana me ka ʻikepili i kahi waihona i mākaukau.

ViennaNET.Orm.Seedwork и ViennaNET.Orm - nā hui nui i loaʻa nā pilina maʻamau a me kā lākou hoʻokō, kēlā me kēia. E nānā pono kākou i kā lākou mau mea.

mau ' IEntityFactoryService a me kona hoʻokō ʻana EntityFactoryService ʻo ia ka wahi hoʻomaka nui no ka hana ʻana me ka waihona, ʻoiai ʻo ka Unit of Work, nā waihona no ka hana ʻana me nā mea kikoʻī, a me nā mea hoʻokō o nā kauoha a me nā nīnau SQL pololei i hana ʻia ma aneʻi. I kekahi manawa he mea maʻalahi ke kaupalena i nā hiki o kahi papa no ka hana ʻana me kahi waihona, no ka laʻana, e hāʻawi i ka hiki ke heluhelu wale i ka ʻikepili. No ia mau hihia IEntityFactoryService aia kekahi kupuna - interface IEntityRepositoryFactory, e haʻi wale ana i kahi ala no ka hana ʻana i nā waihona.

No ke komo pololei ʻana i ka waihona, hoʻohana ʻia ka mīkini hāʻawi. Loaʻa i kēlā me kēia DBMS a mākou e hoʻohana ai i kā mākou hui i kāna hoʻokō ponoʻī: ViennaNET.Orm.MSSQL, ViennaNET.Orm.Oracle, ViennaNET.Orm.SQLite, ViennaNET.Orm.PostgreSql.

I ka manawa like, hiki ke hoʻopaʻa inoa ʻia kekahi mau mea hoʻolako i hoʻokahi noi i ka manawa like, e hiki ai, no ka laʻana, i loko o ke ʻano o ka lawelawe hoʻokahi, me ka ʻole o nā kumukūʻai no ka hoʻololi ʻana i ka ʻōnaehana, e hoʻokō i kahi neʻe ʻana i kēlā me kēia pae. kekahi DBMS i kekahi. Hoʻokō ʻia ka mīkini no ke koho ʻana i ka pili pono a, no laila, ʻo ka mea hoʻolako no kahi papa hui kikoʻī (no ka palapala ʻana i nā papa ʻikepili i kākau ʻia) ma o ka hoʻopaʻa inoa ʻana i ka hui ma ka papa BoundedContext (loaʻa ke ʻano no ka hoʻopaʻa inoa ʻana i nā hui domain) a i ʻole kona hope. ApplicationContext (loaʻa nā ʻano no ka hoʻopaʻa inoa ʻana i nā hui noi, nā noi pololei a me nā kauoha), kahi i ʻae ʻia ai ka mea hoʻohui pili mai ka hoʻonohonoho ʻana ma ke ʻano he hoʻopaʻapaʻa:

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

Laʻana ApplicationContext:

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

Inā ʻaʻole i kuhikuhi ʻia ka ID pili, a laila e hoʻohana ʻia ka pilina i kapa ʻia ʻo "default".

Hoʻokō ʻia ka palapala ʻāina pololei o nā hui i nā papa ʻikepili me ka hoʻohana ʻana i nā mea hana maʻamau NHibernate. Hiki iā ʻoe ke hoʻohana i ka wehewehe ma o nā faila xml a ma o nā papa. No ke kākau maʻalahi o nā waihona stub i nā hoʻokolohua Unit, aia kahi waihona ViennaNET.TestUtils.Orm.

Hiki ke loaʻa nā hiʻohiʻona piha o ka hoʻohana ʻana iā ViennaNET.Orm.* maanei.

ViennaNET.Messaging.*

He pūʻulu waihona no ka hana ʻana me nā pila.

No ka hana pū ʻana me nā queues, ua koho ʻia ke ala like me nā DBMS like ʻole, ʻo ia hoʻi, ka ʻoi loa o ka hiki ke hoʻohui like ʻia e pili ana i ka hana ʻana me ka waihona, me ka nānā ʻole i ka luna queue i hoʻohana ʻia. Hale Waihona Puke ViennaNET.Messaging ʻo ia ke kuleana no kēia hui ʻana, a ViennaNET.Messaging.MQSeriesQueue, ViennaNET.Messaging.RabbitMQQueue и ViennaNET.Messaging.KafkaQueue Loaʻa nā hoʻokō hoʻopili no IBM MQ, RabbitMQ a me Kafka, kēlā me kēia.

I ka hana ʻana me nā queues, ʻelua kaʻina hana: ka loaʻa ʻana o kahi leka a hoʻouna ʻia.

E noʻonoʻo e loaʻa. Aia nā koho 2 ma aneʻi: no ka hoʻolohe mau ʻana a no ka loaʻa ʻana o kahi leka hoʻokahi. No ka hoʻolohe mau ʻana i ka pila, pono ʻoe e wehewehe mua i ka papa hana i hoʻoili ʻia mai IMessageProcessor, nona ke kuleana no ka hana ʻana i ka memo e hiki mai ana. A laila, pono e "pili" i kahi pila kikoʻī; hana ʻia kēia ma o ka hoʻopaʻa inoa ʻana IQueueReactorFactory e hōʻike ana i ka mea hōʻike queue mai ka hoʻonohonoho:

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

Laʻana o ka hoʻomaka ʻana i ka hoʻolohe:

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

A laila, i ka wā e hoʻomaka ai ka lawelawe a kāhea ʻia ke ʻano e hoʻomaka ai e hoʻolohe, e hele nā ​​memo āpau mai ka queue i kuhikuhi ʻia i ke kaʻina hana.

No ka loaʻa ʻana o hoʻokahi memo ma kahi kikowaena hale hana IMessagingComponentFactory aia ke ala CreateMessageReceivere hoʻokumu i kahi mea hoʻokipa e kali ana i kahi leka mai ka pila i kuhikuhi ʻia iā ia:

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

E hoʻouna i kahi leka pono ʻoe e hoʻohana like IMessagingComponentFactory a hana i ka mea hoʻouna memo:

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

ʻEkolu mau koho i hoʻomākaukau ʻia no ka serializing a me ka deserializing i kahi memo: he kikokikona wale nō, XML a me JSON, akā inā pono, hiki iā ʻoe ke hana maʻalahi i kāu hoʻokō ponoʻī. IMessageSerializer и IMessageDeserializer.

Ua hoʻāʻo mākou e mālama i nā mana kūʻokoʻa o kēlā me kēia luna queue, e.g. ViennaNET.Messaging.MQSeriesQueue hiki iā ʻoe ke hoʻouna ʻaʻole wale i ka kikokikona, akā i nā memo byte, a ViennaNET.Messaging.RabbitMQQueue kākoʻo i ka routing a me ka queuing on-the-fly. Hoʻokomo pū kā mākou mea hoʻopili hoʻololi no RabbitMQ i kekahi ʻano like o RPC: hoʻouna mākou i kahi leka a kali i ka pane mai kahi pila kūikawā kūikawā, i hana ʻia no hoʻokahi leka pane.

ʻaneʻi he laʻana o ka hoʻohana ʻana i nā queues me nā nuances pili kumu.

ViennaNET.CallContext

Hoʻohana mākou i nā queues ʻaʻole wale no ka hoʻohui ʻana ma waena o nā ʻōnaehana like ʻole, akā no ka kamaʻilio ʻana ma waena o nā microservices o ka noi like, no ka laʻana, i loko o kahi saga. Ua alakaʻi kēia i ka pono e hoʻouna pū me ka memo i nā ʻikepili kōkua e like me ke komo ʻana o ka mea hoʻohana, noi i ka ʻike no ka hoʻopaʻa inoa hope-a-hope, kumu IP address a me ka ʻikepili ʻae. No ka hoʻokō ʻana i ka hoʻouna ʻana i kēia ʻikepili, kūkulu mākou i kahi waihona ViennaNET.CallContext, hiki iā ʻoe ke mālama i ka ʻikepili mai kahi noi e komo ana i ka lawelawe. I kēia hihia, ʻaʻole pili ke ʻano o ka noi ʻana, ma o ka queue a i ʻole ma Http. A laila, ma mua o ka hoʻouna ʻana i ka noi a i ʻole ka leka, lawe ʻia ka ʻikepili mai ka pōʻaiapili a waiho ʻia i nā poʻo. No laila, loaʻa i ka lawelawe aʻe ka ʻikepili kōkua a mālama iā ia ma ke ʻano like.

Mahalo iā ʻoe no kou nānā ʻana, ke kakali nei mākou i kāu mau ʻōlelo a me nā noi huki!

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka