Rumah >pembangunan bahagian belakang >Tutorial C#.Net >Cara menangani transaksi yang diedarkan dan isu penghantaran mesej dan penyelesaian dalam pembangunan C#
Cara menangani transaksi yang diedarkan dan isu penghantaran mesej dan penyelesaian dalam pembangunan C#
Dalam sistem yang diedarkan, urus niaga dan mesej yang diedarkan. masalah biasa. Urus niaga teragih merujuk kepada transaksi yang melibatkan pelbagai pangkalan data atau perkhidmatan, manakala pemesejan merujuk kepada komunikasi tak segerak antara komponen berbeza dalam sistem. Artikel ini akan memperkenalkan cara menangani isu ini dalam pembangunan C# dan menyediakan contoh kod khusus.
1. Masalah dan penyelesaian transaksi yang diedarkan
Dalam transaksi nod tunggal tradisional, logik pemprosesan transaksi dirangkumkan dalam operasi pangkalan data. Walau bagaimanapun, dalam sistem yang diedarkan, berbilang pangkalan data atau perkhidmatan terlibat, yang menimbulkan isu konsistensi transaksi. Di bawah ialah beberapa masalah transaksi edaran biasa dan penyelesaian yang sepadan.
public async Task UpdateOrder(Order order) { using (var dbContext = new ApplicationDbContext()) { dbContext.Orders.Attach(order); dbContext.Entry(order).Property(p => p.Version).OriginalValue = order.Version; dbContext.Entry(order).Property(p => p.Version).CurrentValue++; dbContext.Entry(order).Property(p => p.Status).IsModified = true; try { await dbContext.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { // Handle concurrency exception } } }
public void PlaceOrder(Order order) { using (var scope = new TransactionScope()) { // Perform database operations var messageSession = await Endpoint.Start(new EndpointConfiguration { // Configuration options for NServiceBus }); await messageSession.SendLocal(new ProcessOrderCommand { // Command properties }); scope.Complete(); } }
2. Isu dan penyelesaian penghantaran mesej
Dalam sistem yang diedarkan, Pemesejan ialah kaedah biasa komunikasi decoupled dan tak segerak. Komponen yang berbeza berkomunikasi dengan menghantar mesej, yang boleh meningkatkan fleksibiliti dan skalabiliti sistem. Berikut ialah beberapa masalah pemesejan biasa dan penyelesaiannya yang sepadan.
public void SendMessage(string message) { var factory = new ConnectionFactory { HostName = "localhost", UserName = "guest", Password = "guest" }; using (var connection = factory.CreateConnection()) using (var channel = connection.CreateModel()) { channel.QueueDeclare(queue: "myQueue", durable: true, exclusive: false, autoDelete: false, arguments: null); var body = Encoding.UTF8.GetBytes(message); var properties = channel.CreateBasicProperties(); properties.Persistent = true; channel.BasicPublish(exchange: "", routingKey: "myQueue", basicProperties: properties, body: body); } }
public void ProcessMessage(Message message) { var messageId = message.Id; using (var redis = ConnectionMultiplexer.Connect("localhost")) { var db = redis.GetDatabase(); if (!db.SetAdd("processedMessages", messageId)) { // Skip processing duplicate message return; } // Process the message } }
Ringkasan
Transaksi dan pemesejan yang diedarkan adalah isu biasa dalam pembangunan C#. Untuk urus niaga yang diedarkan, isu seperti kawalan serentak dan pengendalian pengecualian perlu diselesaikan dan teknologi seperti kawalan serentak optimistik dan baris gilir mesej boleh digunakan. Untuk penghantaran mesej, masalah seperti kehilangan mesej dan pertindihan mesej perlu diselesaikan, dan perisian tengah mesej dan mekanisme penyahduplikasi mesej boleh digunakan. Contoh kod yang disediakan di atas boleh digunakan sebagai rujukan untuk membantu pembangun mengendalikan transaksi yang diedarkan dan isu pemesejan dengan lebih baik.
Atas ialah kandungan terperinci Cara menangani transaksi yang diedarkan dan isu penghantaran mesej dan penyelesaian dalam pembangunan C#. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!