ViennaNET: маҷмӯи китобхонаҳо барои пуштибонӣ. Қисми 2

Ҷамъияти таҳиягарони Raiffeisenbank .NET баррасии мухтасари мундариҷаи ViennaNET-ро идома медиҳад. Дар бораи чӣ гуна ва чаро мо ба ин шумо метавонед қисми якумро хонед.

Дар ин мақола, мо аз китобхонаҳои ҳанӯз баррасӣнашуда барои кор бо транзаксияҳои тақсимшуда, навбатҳо ва пойгоҳи додаҳо мегузарем, ки онҳоро дар анбори GitHub мо пайдо кардан мумкин аст (манбаъҳо дар ин ҷо ҳастанд), ва Бастаҳои Nuget дар ин ҷо.

ViennaNET: маҷмӯи китобхонаҳо барои пуштибонӣ. Қисми 2

ViennaNET.Sagas

Вақте ки лоиҳа ба меъмории DDD ва микросервис мегузарад, пас вақте ки мантиқи тиҷорӣ дар байни хидматҳои гуногун тақсим карда мешавад, мушкили марбут ба зарурати татбиқи механизми транзаксияҳои тақсимшуда ба миён меояд, зеро бисёр сенарияҳо аксар вақт ба якчанд доменҳо якбора таъсир мерасонанд. Шумо метавонед бо чунин механизмҳо муфассалтар шинос шавед, масалан, дар китоби "Микросервисҳо намунаҳо", Крис Ричардсон.

Дар лоидадои худ мо механизми оддй, вале муфидро ба амал овардем: достон, дурусттараш достони оркестрй. Моҳияти он чунин аст: як сенарияи муайяни тиҷорат вуҷуд дорад, ки дар он амалиётро дар хидматҳои гуногун пай дар пай иҷро кардан лозим аст ва агар дар ягон қадам ягон мушкилот ба миён ояд, бояд тартиби бозгаштро барои ҳамаи қадамҳои қаблӣ даъват кард, ки дар он ҷо. таъмин карда шудааст. Ҳамин тариқ, дар охири достон, новобаста аз муваффақият, мо дар ҳама доменҳо маълумоти пайваста мегирем.

Татбиқи мо ҳоло ҳам дар шакли асосии он сурат мегирад ва ба истифодаи ягон усулҳои ҳамкорӣ бо хидматҳои дигар вобаста нест. Истифодаи он душвор нест: танҳо як насли синфи абстрактии асоси SagaBase<T> созед, ки дар он T синфи контекстии шумост, ки дар он шумо метавонед маълумоти ибтидоиро барои кор кардани достон ва инчунин баъзе натиҷаҳои фосилавӣ нигоҳ доред. Намунаи контекстӣ ба тамоми қадамҳо ҳангоми иҷро интиқол дода мешавад. Худи Saga як синфи бешаҳрванд аст, аз ин рӯ инстансияро метавон дар DI ҳамчун Singleton ҷойгир кард, то вобастагии заруриро ба даст орад.

Намунаи реклама:

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

Намунаи занг:

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

Намунаҳои пурраи татбиқи гуногунро дидан мумкин аст дар ин ҷо ва дар ҷамъомад бо озмоишҳо.

ViennaNET.Orm.*

Маҷмӯи китобхонаҳо барои кор бо пойгоҳи додаҳои гуногун тавассути Nhibernate. Мо усули DB-First-ро бо истифода аз Liquibase истифода мебарем, бинобар ин танҳо функсия барои кор бо додаҳо дар пойгоҳи додаҳои омода мавҷуд аст.

ViennaNET.Orm.Seedwork и ViennaNET.Orm – ассамблеяҳои асосӣ, ки дорои интерфейсҳои асосӣ ва татбиқи онҳо мебошанд. Биёед мундариҷаи онҳоро муфассалтар дида бароем.

интерфейси IEntityFactoryService ва татбиқи он EntityFactoryService нуктаи асосии кор бо махзани маълумот мебошанд, зеро дар ин чо вохиди кор, анборхо барои кор бо объектхои мушаххас, инчунин ичрокунандагони фармонхо ва дархостхои бевоситаи SQL сохта шудаанд. Баъзан маҳдуд кардани имкониятҳои синф барои кор бо базаи маълумот қулай аст, масалан, имконияти танҳо хондани маълумотро таъмин кардан. Барои чунин ҳолатҳо IEntityFactoryService интерфейси аҷдодӣ вуҷуд дорад IEntityRepositoryFactory, ки танҳо усули эҷоди анборҳоро эълон мекунад.

Барои дастрасии мустақим ба пойгоҳи додаҳо механизми провайдер истифода мешавад. Ҳар як DBMS, ки мо дар гурӯҳҳои мо истифода мебарем, татбиқи худро дорад: ViennaNET.Orm.MSSQL, ViennaNET.Orm.Oracle, ViennaNET.Orm.SQLite, ViennaNET.Orm.PostgreSql.

Ҳамзамон, дар як замима якчанд провайдерҳоро дар як вақт сабти ном кардан мумкин аст, ки ин имкон медиҳад, масалан, дар доираи як хидмат бидуни хароҷот барои тағир додани инфрасохтор, марҳила ба марҳила муҳоҷиратро аз як DBMS ба дигараш. Механизми интихоби пайвасти зарурӣ ва аз ин рӯ, провайдер барои як синфи мушаххаси объект (барои он харитасозӣ ба ҷадвалҳои пойгоҳи додаҳо навишта шудааст) тавассути бақайдгирии объект дар синфи BoundedContext (барои усули бақайдгирии субъектҳои доменӣ) ё вориси он амалӣ карда мешавад. ApplicationContext (барои бақайдгирии объектҳои барнома, дархост ва фармонҳои мустақим), ки дар он идентификатори пайвастшавӣ аз конфигуратсия ҳамчун аргумент қабул карда мешавад:

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

Намунаи Context Application:

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

Агар ID-и пайвастшавӣ муайян нашуда бошад, он гоҳ пайвасти бо номи "пешфарз" истифода мешавад.

Харитасозии мустақими объектҳо ба ҷадвалҳои пойгоҳи додаҳо бо истифода аз асбобҳои стандартии NHibernate амалӣ карда мешавад. Шумо метавонед тавсифро ҳам тавассути файлҳои xml ва ҳам тавассути синфҳо истифода баред. Барои навиштани қулайи анборҳои ноустувор дар санҷишҳои воҳид, китобхона мавҷуд аст ViennaNET.TestUtils.Orm.

Намунаҳои пурраи истифодаи ViennaNET.Orm.*-ро ёфтан мумкин аст дар ин ҷо.

ViennaNET.Messaging.*

Маҷмӯи китобхонаҳо барои кор бо навбат.

Барои кор бо навбатҳо ҳамон равиш, ки бо МДМ-ҳои гуногун интихоб карда шуд, яъне равиши ҳадди имконпазири ягона дар робита бо кор бо китобхона, новобаста аз менеҷери навбати истифодашуда интихоб карда шуд. Китобхона ViennaNET.Messaging барои ин муттахидшавй махз масъул аст ва ViennaNET.Messaging.MQSeriesQueue, ViennaNET.Messaging.RabbitMQQueue и ViennaNET.Messaging.KafkaQueue дорои татбиқи адаптер барои IBM MQ, RabbitMQ ва Kafka мутаносибан.

Ҳангоми кор бо навбатҳо ду раванд вуҷуд дорад: қабули паём ва фиристодани он.

Дар бораи қабул кардан фикр кунед. Дар ин ҷо 2 вариант вуҷуд дорад: барои гӯш кардани пайваста ва қабули як паём. Барои пайваста гӯш кардани навбат, шумо бояд аввал синфи протсессори аз мерос гирифташударо тавсиф кунед IMessageProcessor, ки барои коркарди паёми воридотӣ масъул хоҳад буд. Баъдан, он бояд ба навбати мушаххас "пайванд" шавад; ин тавассути сабти ном дар IQueueReactorFactory бо нишон додани идентификатори навбат аз конфигуратсия:

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

Намунаи оғози гӯш кардан:

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

Пас аз он, вақте ки хидмат оғоз мешавад ва усул барои оғоз кардани гӯш даъват карда мешавад, ҳама паёмҳо аз навбати нишондодашуда ба протсессори мувофиқ мераванд.

Барои гирифтани як паём дар интерфейси завод IMessagingComponentFactory усул вуҷуд дорад CreateMessageReceiverки қабулкунандаеро эҷод мекунад, ки паёмро аз навбати ба он муқарраршуда интизор аст:

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

Барои фиристодани паём шумо бояд ҳамон чизро истифода баред IMessagingComponentFactory ва ирсолкунандаи паём эҷод кунед:

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

Се варианти омода барои силсиласозӣ ва ғайрисериализатсияи паём вуҷуд дорад: танҳо матн, XML ва JSON, аммо агар лозим бошад, шумо метавонед ба осонӣ татбиқи интерфейси худро созед. IMessageSerializer и IMessageDeserializer.

Мо кӯшиш кардем, ки қобилиятҳои беназири ҳар як мудири навбатро нигоҳ дорем, масалан. ViennaNET.Messaging.MQSeriesQueue ба шумо имкон медиҳад, ки на танҳо матн, балки паёмҳои байтӣ ва ViennaNET.Messaging.RabbitMQQueue масир ва навбатдории парвозро дастгирӣ мекунад. Сарпӯши адаптерии мо барои RabbitMQ инчунин як намуди RPC-ро амалӣ мекунад: мо паём мефиристем ва интизори посух аз навбати махсуси муваққатӣ ҳастем, ки танҳо барои як паёми ҷавобӣ сохта шудааст.

дар ин ҷо мисоли истифодаи навбатҳо бо нозукиҳои асосии пайвастшавӣ.

ViennaNET.CallContext

Мо навбатҳоро на танҳо барои ҳамгироӣ байни системаҳои гуногун, балки барои иртибот байни микросервисҳои як барнома истифода мебарем, масалан, дар дохили як. Ин боиси зарурати интиқоли маълумоти ёрирасон дар баробари паём ба монанди воридшавии корбар, идентификатори дархост барои сабти ба охир, суроғаи IP манбаъ ва маълумоти авторизатсия гардид. Барои татбиқи интиқоли ин маълумот мо китобхона таҳия кардем ViennaNET.CallContext, ки ба шумо имкон медиҳад, ки маълумотро аз дархосте, ки ба хидмат ворид мешавад, нигоҳ доред. Дар ин ҳолат, чӣ гуна дархост тавассути навбат ё тавассути Http дода шудааст, аҳамият надорад. Сипас, пеш аз фиристодани дархост ё паёми содиротӣ, маълумот аз контекст гирифта мешавад ва дар сарлавҳаҳо ҷойгир карда мешавад. Ҳамин тариқ, хидмати навбатӣ маълумоти ёрирасонро қабул мекунад ва онро ҳамон тавр идора мекунад.

Ташаккур барои таваҷҷуҳ, мо интизори шарҳҳо ва дархостҳои шумост!

Манбаъ: will.com

Илова Эзоҳ