成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

從CRUD到高并發架構:用C#實現秒殺系統的終極方案

開發 架構
引入監控系統,如Prometheus和Grafana,實時監控系統的各項指標,包括CPU使用率、內存占用、數據庫連接數等。在系統中添加詳細的日志記錄,記錄關鍵操作和異常信息,便于在出現問題時進行排查和分析。

在當今的互聯網應用開發中,構建高并發系統是一項極具挑戰性的任務。秒殺系統作為典型的高并發場景,對系統的性能、穩定性和可靠性提出了極高的要求。本文將帶領大家從基礎的CRUD操作開始,逐步深入到高并發架構的設計與實現,最終打造一個基于C#的高性能秒殺系統。

一、理解秒殺系統的業務需求 

1.1 業務場景

秒殺系統通常應用于電商平臺、票務系統等場景,在特定時間點,大量用戶同時搶購有限數量的商品或服務。例如,電商平臺的限時搶購活動,用戶在規定的幾分鐘內搶購特價商品;票務系統中熱門演出或賽事門票的瞬間開售等。

1.2 核心需求

  • 高并發處理能力:能夠應對瞬間涌入的大量請求,確保系統不崩潰、不卡頓。
  • 數據一致性:保證商品庫存數量的準確性,避免超賣現象的發生。
  • 快速響應:用戶操作能夠得到及時反饋,提升用戶體驗。
  • 安全可靠:防止惡意攻擊,如機器人刷單等行為。

二、技術選型與準備 

2.1 后端框架

我們選擇ASP.NET Core作為后端開發框架。ASP.NET Core具有高性能、跨平臺、依賴注入等特性,非常適合構建高并發的Web應用。通過NuGet包管理器,安裝以下核心包:

  • Microsoft.AspNetCore.App:ASP.NET Core應用的基礎包。
  • Microsoft.EntityFrameworkCore.SqlServer:用于連接和操作SQL Server數據庫。

2.2 數據庫

SQL Server作為關系型數據庫,具備強大的數據管理和事務處理能力,適合存儲商品信息、訂單數據等。在appsettings.json文件中配置數據庫連接字符串:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=YOUR_SERVER_NAME;Database=YOUR_DATABASE_NAME;User ID=YOUR_USERNAME;Password=YOUR_PASSWORD"
  }
}

2.3 緩存

Redis作為內存緩存,具有極高的讀寫速度,能夠有效減輕數據庫壓力。安裝StackExchange.Redis包來操作Redis。在Startup.cs中配置Redis連接:

using StackExchange.Redis;

public void ConfigureServices(IServiceCollection services)
{
    var redis = ConnectionMultiplexer.Connect("YOUR_REDIS_SERVER:6379");
    services.AddSingleton<IConnectionMultiplexer>(redis);
}

三、從CRUD到高并發架構的演進 

3.1 基礎CRUD操作

首先,創建商品和訂單的實體類,使用Entity Framework Core進行數據庫的CRUD操作。

  • 商品實體類:
public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Stock { get; set; }
}
  • 訂單實體類:
public class Order
{
    public int Id { get; set; }
    public int ProductId { get; set; }
    public string UserId { get; set; }
    public DateTime OrderTime { get; set; }
}
  • 數據訪問層(DAL)示例:
public class ProductRepository
{
    private readonly YourDbContext _context;

    public ProductRepository(YourDbContext context)
    {
        _context = context;
    }

    public async Task<Product> GetProductById(int id)
    {
        return await _context.Products.FindAsync(id);
    }

    public async Task UpdateProductStock(int id, int newStock)
    {
        var product = await _context.Products.FindAsync(id);
        product.Stock = newStock;
        await _context.SaveChangesAsync();
    }
}

3.2 引入緩存優化

在高并發場景下,頻繁訪問數據庫會導致性能瓶頸。通過引入Redis緩存,將熱門商品信息緩存起來,減少數據庫查詢次數。

  • 緩存獲取商品信息示例:
public async Task<Product> GetProductByIdFromCache(int id)
{
    var redis = _connectionMultiplexer.GetDatabase();
    var productJson = await redis.StringGetAsync($"product:{id}");
    if (!string.IsNullOrEmpty(productJson))
    {
        return JsonConvert.DeserializeObject<Product>(productJson);
    }
    var product = await _productRepository.GetProductById(id);
    if (product != null)
    {
        await redis.StringSetAsync($"product:{id}", JsonConvert.SerializeObject(product));
    }
    return product;
}

3.3 高并發架構設計

為了應對高并發,我們采用以下架構設計:

  • 負載均衡:使用Nginx作為負載均衡器,將請求均勻分配到多個后端服務器實例上,避免單點服務器過載。
  • 消息隊列:引入RabbitMQ作為消息隊列,將訂單創建等操作異步化。當用戶下單時,先將訂單信息發送到消息隊列,由專門的消費者服務從隊列中取出訂單信息進行處理,這樣可以削峰填谷,減輕數據庫的壓力。
  • 分布式鎖:為了保證商品庫存的一致性,使用Redis分布式鎖。在進行庫存扣減操作前,先獲取分布式鎖,確保同一時間只有一個線程能夠操作庫存。
public async Task<bool> TryAcquireLockAsync(string lockKey, string requestId, TimeSpan expirationTime)
{
    var redis = _connectionMultiplexer.GetDatabase();
    return await redis.StringSetAsync(lockKey, requestId, expirationTime, When.NotExists);
}

public async Task ReleaseLockAsync(string lockKey, string requestId)
{
    var redis = _connectionMultiplexer.GetDatabase();
    var script = @"
        if redis.call('GET', KEYS[1]) == ARGV[1] then
            return redis.call('DEL', KEYS[1])
        else
            return 0
        end
    ";
    await redis.ScriptEvaluateAsync(
        LuaScript.Prepare(script),
        new RedisKey[] { lockKey },
        new RedisValue[] { requestId });
}

四、實現秒殺系統的核心邏輯 

4.1 秒殺接口設計

創建一個API接口來處理秒殺請求。在接口中,先從緩存中獲取商品信息,檢查庫存是否充足,然后嘗試獲取分布式鎖進行庫存扣減操作,最后將訂單信息發送到消息隊列。

[ApiController]
[Route("[controller]")]
public class SeckillController : ControllerBase
{
    private readonly IProductService _productService;
    private readonly IOrderService _orderService;
    private readonly IDistributedLockService _lockService;

    public SeckillController(
        IProductService productService,
        IOrderService orderService,
        IDistributedLockService lockService)
    {
        _productService = productService;
        _orderService = orderService;
        _lockService = lockService;
    }

    [HttpPost]
    public async Task<IActionResult> Seckill([FromBody] SeckillRequest request)
    {
        var product = await _productService.GetProductByIdFromCache(request.ProductId);
        if (product == null || product.Stock <= 0)
        {
            return BadRequest("商品已售罄");
        }

        var lockKey = $"seckill:{request.ProductId}";
        var requestId = Guid.NewGuid().ToString();
        if (!await _lockService.TryAcquireLockAsync(lockKey, requestId, TimeSpan.FromSeconds(10)))
        {
            return BadRequest("系統繁忙,請稍后重試");
        }

        try
        {
            var success = await _productService.DecreaseStock(product.Id);
            if (success)
            {
                var order = new Order
                {
                    ProductId = product.Id,
                    UserId = request.UserId,
                    OrderTime = DateTime.Now
                };
                await _orderService.AddOrderToQueue(order);
                return Ok("秒殺成功");
            }
            else
            {
                return BadRequest("商品已售罄");
            }
        }
        finally
        {
            await _lockService.ReleaseLockAsync(lockKey, requestId);
        }
    }
}

4.2 訂單處理與庫存管理

訂單處理服務從消息隊列中消費訂單信息,將訂單數據持久化到數據庫。庫存管理服務負責在接收到庫存扣減請求時,確保庫存數量的準確性。

  • 訂單處理服務示例:
public class OrderService : IOrderService
{
    private readonly IModel _rabbitMqModel;
    private readonly YourDbContext _context;

    public OrderService(IModel rabbitMqModel, YourDbContext context)
    {
        _rabbitMqModel = rabbitMqModel;
        _context = context;
    }

    public async Task AddOrderToQueue(Order order)
    {
        var body = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(order));
        _rabbitMqModel.BasicPublish(
            exchange: "",
            routingKey: "order_queue",
            basicProperties: null,
            body: body);
    }

    public async Task ProcessOrders()
    {
        var consumer = new EventingBasicConsumer(_rabbitMqModel);
        consumer.Received += async (model, ea) =>
        {
            var body = ea.Body.ToArray();
            var orderJson = Encoding.UTF8.GetString(body);
            var order = JsonConvert.DeserializeObject<Order>(orderJson);
            _context.Orders.Add(order);
            await _context.SaveChangesAsync();
            _rabbitMqModel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
        };
        _rabbitMqModel.BasicConsume(
            queue: "order_queue",
            autoAck: false,
            consumer: consumer);
    }
}
  • 庫存管理服務示例:
public class ProductService : IProductService
{
    private readonly ProductRepository _productRepository;
    private readonly IConnectionMultiplexer _connectionMultiplexer;

    public ProductService(
        ProductRepository productRepository,
        IConnectionMultiplexer connectionMultiplexer)
    {
        _productRepository = productRepository;
        _connectionMultiplexer = connectionMultiplexer;
    }

    public async Task<bool> DecreaseStock(int productId)
    {
        var product = await _productRepository.GetProductById(productId);
        if (product == null || product.Stock <= 0)
        {
            return false;
        }
        product.Stock--;
        await _productRepository.UpdateProductStock(productId, product.Stock);
        var redis = _connectionMultiplexer.GetDatabase();
        await redis.StringSetAsync($"product:{productId}", JsonConvert.SerializeObject(product));
        return true;
    }
}

五、系統測試與優化 

5.1 性能測試

使用工具如JMeter對秒殺系統進行性能測試,模擬大量并發用戶請求,觀察系統的響應時間、吞吐量等指標。根據測試結果,調整系統參數,如緩存過期時間、消息隊列的并發消費者數量等。

5.2 安全優化

防止惡意攻擊是秒殺系統的重要環節。通過設置驗證碼、限制單個IP的請求頻率等方式,阻止機器人刷單行為。同時,對用戶輸入進行嚴格的參數校驗,防止SQL注入等安全漏洞。

5.3 監控與日志

引入監控系統,如Prometheus和Grafana,實時監控系統的各項指標,包括CPU使用率、內存占用、數據庫連接數等。在系統中添加詳細的日志記錄,記錄關鍵操作和異常信息,便于在出現問題時進行排查和分析。

通過以上步驟,我們成功地從基礎的CRUD操作構建出了一個具備高并發處理能力的秒殺系統。在實際應用中,還需要根據業務需求和系統運行情況不斷進行優化和完善,以確保系統的穩定性和可靠性。希望本文能為你在構建高并發系統的道路上提供有價值的參考。

責任編輯:武曉燕 來源: 程序員編程日記
相關推薦

2020-10-14 07:20:53

高并發

2024-08-01 11:38:40

2024-07-03 11:01:55

2018-09-15 04:59:01

2025-02-20 00:01:00

2025-03-03 07:00:00

C#分布式緩存高并發

2021-08-26 08:24:33

高并發秒殺系統

2025-03-27 00:14:10

2022-08-26 10:24:48

架構Golang

2021-06-23 06:48:42

秒殺Java電商

2025-03-10 06:00:00

2019-02-15 10:11:23

2019-10-30 16:54:08

golangredis數據庫

2009-06-16 14:43:23

大型網站系統架構

2020-04-13 08:33:39

高并發秒殺系統

2010-11-08 10:20:18

2022-03-18 09:11:56

高并發搶購系統架構

2024-11-25 09:10:03

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 怡红院免费的全部视频 | 午夜免费网 | 精品无码久久久久久国产 | 在线日韩中文字幕 | 日韩国产欧美在线观看 | 欧美一区二区三区久久精品 | 日韩欧美精品在线 | 视频一区在线观看 | 精产嫩模国品一二三区 | 国产亚洲一区二区三区在线 | 成人国产在线观看 | 中文字幕一区二区三区四区五区 | 久久精品二区 | 亚洲视频免费在线 | 国产免费自拍 | 欧美啊v在线观看 | 午夜网址 | 久草热8精品视频在线观看 午夜伦4480yy私人影院 | 午夜精品一区二区三区在线视频 | 国产精品有限公司 | 色爽女 | 国产精品久久久久久久久久免费看 | 国产精品99久久久久久久久久久久 | 亚洲乱码国产乱码精品精的特点 | 中文在线一区 | 国外成人在线视频 | 一级大片 | 特一级毛片 | 农村真人裸体丰满少妇毛片 | 色婷婷亚洲国产女人的天堂 | 看真人视频一级毛片 | 一区二区三区高清 | 嫩草91在线| 国产精品视频免费看 | 99小视频| 国产午夜精品理论片a大结局 | 精品久久精品 | 久草青青| 黄色一级电影免费观看 | 精精国产xxxx视频在线播放 | 激情在线视频 |