Rumah  >  Artikel  >  pembangunan bahagian belakang  >  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#

WBOY
WBOYasal
2023-10-10 11:42:151095semak imbas

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.

  1. Concurrency control: Operasi serentak adalah perkara biasa dalam sistem teragih Jika berbilang transaksi mengakses dan mengubah suai data yang sama pada masa yang sama, ketidakkonsistenan data mungkin berlaku. Satu penyelesaian ialah menggunakan kawalan konkurensi optimistik, menggunakan nombor versi atau cap masa untuk menentukan sama ada data telah diubah suai oleh transaksi lain. Berikut ialah contoh kod yang menggunakan Teras EF untuk melaksanakan kawalan konkurensi optimistik:
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
        }
    }
}
  1. Pengendalian pengecualian: Dalam sistem teragih, pelbagai situasi tidak normal mungkin berlaku, seperti rangkaian kegagalan, masa berhenti perkhidmatan, dsb. Apabila pengecualian berlaku dalam transaksi, operasi rollback diperlukan untuk mengekalkan konsistensi data. Ini biasanya boleh dicapai menggunakan transaksi pampasan atau baris gilir mesej. Berikut ialah contoh kod yang menggunakan baris gilir mesej NServiceBus untuk memproses transaksi yang diedarkan:
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.

  1. Kehilangan mesej: Semasa proses penghantaran mesej, mesej mungkin hilang disebabkan kegagalan rangkaian atau sebab lain. Untuk menyelesaikan masalah ini, perisian tengah mesej boleh digunakan untuk memastikan penghantaran mesej yang boleh dipercayai. Berikut ialah contoh kod yang menggunakan perisian tengah mesej RabbitMQ untuk menghantar mesej:
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);
    }
}
  1. Penduaan mesej: Dalam sistem yang diedarkan, disebabkan rangkaian dan sebab lain, penduaan mesej mungkin berlaku hantar. Untuk menyelesaikan masalah ini, mekanisme deduplikasi mesej boleh digunakan. Kaedah biasa ialah menjana ID mesej unik di peringkat global untuk setiap mesej dan melakukan penyahduplikasian mesej pada bahagian penerima. Berikut ialah contoh kod yang menggunakan Redis untuk melaksanakan penyahduplikasian mesej:
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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn