當前位置: 妍妍網 > 碼農

ShardingCore:EF Core下高效能、輕量級分表分庫讀寫分解離決方案

2024-07-07碼農

隨著現代應用程式對數據處理能力的需求日益增加,單一資料庫在面對大規模數據處理時往往會遇到效能瓶頸。分表分庫和讀寫分離成為提升資料庫效能、擴充套件資料庫容量的重要手段。在.NET生態系中,Entity Framework Core(EF Core)作為輕量級、可延伸、開源和跨平台的物件資料庫對映器,廣泛套用於數據存取層。然而,EF Core原生並不直接支持分表分庫和讀寫分離。因此,一款針對EF Core的高效能、輕量級解決方案——ShardingCore應運而生。

一、ShardingCore簡介

ShardingCore是一款專為EF Core設計的高效能、輕量級分表分庫框架。它以零依賴、零學習成本和零業務程式碼侵入的設計理念,為企業級套用提供了靈活的數據層擴充套件方案。ShardingCore不僅支持EF Core 2+的所有版本和所有支持的資料庫,還提供了自訂路由、動態路由、高效能分頁、讀寫分離等功能。

二、ShardingCore的主要特性

  1. 零依賴 :ShardingCore不依賴任何其他第三方元件,僅需EF Core即可執行,減少了外部因素帶來的復雜性。

  2. 零學習成本 :ShardingCore的API設計簡潔,與標準EF Core非常接近,對新手開發者友好。

  3. 零業務程式碼入侵 :無需改動業務程式碼,只需簡單配置,便可在後台透明地實作數據分片。

  4. 自動分表分庫 :支持多種分表分庫策略,如時間分表、自訂分表、水平分庫等。

  5. 讀寫分離 :支持一主多從的讀寫分離方案,提升系統響應速度。

  6. 高效能分頁 :提供特定的高效能分頁功能,具有低記憶體消耗和高效率。

  7. 多資料庫支持 :支持EF Core支持的所有資料庫,如SQL Server、MySQL、PostgreSQL等。

三、快速上手

下面將透過具體的C#範例程式碼,展示如何在計畫中整合ShardingCore實作分表分庫和讀寫分離。

1. 安裝NuGet包

首先,需要在計畫中安裝ShardingCore相關的NuGet包。以下以使用SQL Server為例:

Install-Package ShardingCore
Install-Package Microsoft.EntityFrameworkCore.SqlServer

如果使用MySQL,則安裝:

Install-Package ShardingCore
Install-Package Pomelo.EntityFrameworkCore.MySql

2. 建立查詢物件模型

定義實體類 Order ,用於對映資料庫中的訂單表:

public classOrder
{
publicstring Id { getset; }
publicstring Payer { getset; }
publiclong Money { getset; }
publicstring Area { getset; }
public OrderStatusEnum OrderStatus { getset; }
public DateTime CreationTime { getset; }
}
publicenum OrderStatusEnum
{
NoPay = 1,
Paying = 2,
Payed = 3,
PayFail = 4
}

3. 建立DbContext

繼承 AbstractShardingDbContext 並實作 IShardingTableDbContext 介面(如果需要分表):

public classMyDbContext : AbstractShardingDbContextIShardingTableDbContext
{
publicMyDbContext(DbContextOptions<MyDbContext> options) : base(options)
{
}
protectedoverridevoidOnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Order>(entity =>
{
entity.HasKey(o => o.Id);
entity.Property(o => o.Id).IsRequired().IsUnicode(false).HasMaxLength(50);
entity.Property(o => o.Payer).IsRequired().IsUnicode(false).HasMaxLength(50);
entity.Property(o => o.Area).IsRequired().IsUnicode(false).HasMaxLength(50);
entity.Property(o => o.OrderStatus).HasConversion<int>();
entity.ToTable(nameof(Order));
});
}
public IRouteTail RouteTail { getset; }
}

4. 添加分表路由

定義分表路由規則,這裏以按月分表為例:

public classOrderVirtualTableRoute : AbstractSimpleShardingModKeyDateTimeVirtualTableRoute<Order>
{
publicOrderVirtualTableRoute() : base(DateTimeIntervalType.Month)
{
}
publicoverridevoidConfigure(EntityMetadataTableBuilder<Order> builder)
{
builder.ShardingProperty(o => o.CreationTime);
builder.AutoCreateTable(o => o.CreationTime);
builder.TableSeparator("_");
builder.TailPrefix("Order");
}
}

5. 配置Startup

Startup.cs 中配置ShardingDbContext和路由:

publicvoidConfigureServices(IServiceCollection services)
{
services.AddDbContext<MyDbContext>(options =>
{
options.UseSqlServer("Server=localhost;Database=ShardingDB;User Id=sa;Password=yourpassword;");
});
services.AddShardingDbContext<MyDbContext>()
.AddDefaultDataSource("ds0""Server=localhost;Database=ShardingDB;User Id=sa;Password=yourpassword;")
.AddShardingTableRoute<OrderVirtualTableRoute>()
.UseShardingOptions(o =>
{
o.EnsureCreatedWithOutShardingTable = true;
o.QueryEfCoreLoggerFactory = efCoreLoggerFactory; // 如果有需要,配置日誌
});
}

四、讀寫分離

ShardingCore支持一主多從的讀寫分離方案。配置讀寫分離,通常需要在資料庫連線字串中指定主從資料庫,並透過配置服務來啟用讀寫分離。

1. 定義主從資料庫連線

Startup.cs 中配置主從資料庫連線字串:

services.AddShardingDbContext<MyDbContext>()
.UseRouteConfig(o =>
{
// 主庫配置
o.AddDefaultDataSource("ds0""Server=master_server;Database=MasterDB;User Id=sa;Password=yourpassword;");
// 從庫配置
o.AddExtraDataSource(sp => new Dictionary<stringstring>
{
{"ds1""Server=slave_server1;Database=SlaveDB1;User Id=sa;Password=yourpassword;"},
{"ds2""Server=slave_server2;Database=SlaveDB2;User Id=sa;Password=yourpassword;"}
});
})
// 其他配置...

2. 讀寫分離策略

ShardingCore支持透過配置策略來控制讀寫操作分配到不同的資料庫。預設情況下,寫操作會發送到主庫,讀操作會根據配置的負載均衡策略分發到從庫。

五、總結

ShardingCore作為一款專為EF Core設計的高效能、輕量級分表分庫和讀寫分解離決方案,透過零依賴、零學習成本和零業務程式碼侵入的設計理念,極大地簡化了數據層擴充套件的復雜性。透過簡單的配置和少量的程式碼改動,即可實作數據的分布式儲存和高效的讀寫操作,為大規模數據處理提供了有力的支持。

在實際計畫中,開發者可以根據業務需求靈活配置ShardingCore,實作數據的水平擴充套件和效能最佳化。無論是電商系統的訂單處理,還是社群網路平台的使用者資訊管理,ShardingCore都能提供穩定可靠的數據層解決方案,助力企業應對大數據挑戰。