ABP VNext + Akka.NET:高并發處理與分布式計算

ABP VNext + Akka.NET:高并發處理與分布式計算 🚀

Actor 模型把高并發寫入“分片→串行化”,把鎖與競態壓力轉回到代碼層面的可控順序處理;依托 Cluster.Sharding 橫向擴容,Persistence 宕機可恢復,Streams 保障背壓穩定吞吐;全程采用 Akka.Hosting + 顯式啟動 Sharding 的寫法,弱化對版本特定擴展方法的耦合。??


📚 目錄

  • ABP VNext + Akka.NET:高并發處理與分布式計算 🚀
    • 1)TL;DR ??
    • 2)適用場景 🎯
    • 3)環境與依賴 🧰
    • 4)目標架構與數據流(總覽圖)🗺?
    • 5)最小可跑骨架(單節點,內存持久化)🏃?♂?
      • 5.1 消息與分片提取器(穩定哈希)🔑
      • 5.2 實體 Actor(順序處理 + 快照 + 鈍化)🧠
      • 5.3 Streams 入口 + ACK 閉環(ActorRefWithAck)🔁
        • 5.3.1 端到端背壓閉環 🧨
      • 5.4 Akka.Hosting:顯式啟動 Sharding + DI 注入 🧩
    • 6)與 ABP 應用層對接(IRequiredActor + Ask/Tell)🔗
    • 7)生產切換:SQL Server 持久化 🧱
    • 8)序列化與安全(Hyperion)🛡?
    • 9)Actor 生命周期 🧬
    • 10)Sharding 重分布 📦
    • 11)K8s 拓撲 ??
    • 12)可靠性與容錯 🛠?
    • 13)可觀測性與日志 📊
    • 14)部署:本地多實例 & K8s 🧪
    • 15)性能調優清單 ?
    • 16)常見坑 & 規避 🧨


1)TL;DR ??

  • Actor + Sharding:按實體(DeviceId/OrderId…)順序處理,避免熱點鎖與競態;橫向擴容靠分片重分布。🧩
  • Persistence(事件+快照):進程掛了可回放恢復;開發期可用內存存儲,生產換 SQL/PG。💾
  • Streams 背壓:入口 Source.Queue(..., Backpressure) + ActorRefWithAck 打通端到端背壓閉環。🧯
  • Akka.HostingActorRegistry + IRequiredActor<T> 與 ABP/.NET 的 DI、日志無縫融合。🔌
  • 兩套部署路徑:本地多實例(靜態種子) & K8s(Akka.Management + Cluster Bootstrap)。??

2)適用場景 🎯

  • IoT/日志/交易流水等 寫多讀少每實體需要嚴格順序 的場景;
  • 需要 快速橫向擴容自動失效轉移進程級容錯 的場景;
  • 希望把“拓撲/容錯/限流/背壓”收束到應用代碼表達層的團隊。

3)環境與依賴 🧰

  • .NET / ABP 版本矩陣

    • .NET 7 → ABP 7
    • .NET 8 → ABP 8.0+(推薦)
  • NuGet(核心)
    Akka, Akka.Hosting, Akka.Cluster, Akka.Cluster.Sharding,
    Akka.Persistence.Sql, Akka.Streams, Akka.Logger.Serilog, Akka.Serialization.Hyperion

  • 可選(K8s/管理)
    Akka.Management, Akka.Discovery.KubernetesApi

<ItemGroup><PackageReference Include="Akka" Version="1.5.*" /><PackageReference Include="Akka.Hosting" Version="1.5.*" /><PackageReference Include="Akka.Cluster" Version="1.5.*" /><PackageReference Include="Akka.Cluster.Sharding" Version="1.5.*" /><PackageReference Include="Akka.Persistence.Sql" Version="1.5.*" /><PackageReference Include="Akka.Streams" Version="1.5.*" /><PackageReference Include="Akka.Logger.Serilog" Version="1.5.*" /><PackageReference Include="Akka.Serialization.Hyperion" Version="1.5.*" /><PackageReference Include="Akka.Management" Version="1.5.*" /><PackageReference Include="Akka.Discovery.KubernetesApi" Version="1.5.*" />
</ItemGroup>

4)目標架構與數據流(總覽圖)🗺?

HTTP/gRPC
Tell/Ask
ACK
Tell
Persist
Domain Events
Client
ABP AppService
IngressActor
Akka.Streams Graph
ShardRegion
DeviceActor #1
DeviceActor #2
DeviceActor #N
Journal/Snapshot
ABP EventBus

5)最小可跑骨架(單節點,內存持久化)🏃?♂?

5分鐘跑通閉環(不依賴外部 DB),再切換到 SQL/PG。

5.1 消息與分片提取器(穩定哈希)🔑

// Messages.cs
public interface IDeviceMsg { string DeviceId { get; } }
public sealed record Ingest(string DeviceId, double Value, DateTimeOffset Timestamp) : IDeviceMsg;
public sealed record GetCurrent(string DeviceId) : IDeviceMsg;
public sealed record CurrentState(string DeviceId, double Avg, long Count);// 使用穩定的 HashCodeMessageExtractor,避免 string.GetHashCode() 的跨進程隨機化
using Akka.Cluster.Sharding;
public sealed class DeviceMessageExtractor : HashCodeMessageExtractor
{public DeviceMessageExtractor(int shards) : base(shards) { }public override string EntityId(object message) => ((IDeviceMsg)message).DeviceId;public override object EntityMessage(object message) => message;
}

5.2 實體 Actor(順序處理 + 快照 + 鈍化)🧠

// DeviceEntityActor.cs
using Akka.Actor;
using Akka.Event;
using Akka.Persistence;
using Akka.Cluster.Sharding;public sealed class DeviceEntityActor : ReceivePersistentActor
{private readonly ILoggingAdapter _log = Context.GetLogger();private double _sum; private long _count;public override string PersistenceId { get; }public DeviceEntityActor(){var entityId = Self.Path.Name;          // Sharding 注入PersistenceId = $"device-{entityId}";Command<Ingest>(cmd =>{Persist(cmd, e =>{_sum += e.Value; _count++;if (_count % 1000 == 0) SaveSnapshot((_sum, _count));});});Command<GetCurrent>(q =>{var avg = _count == 0 ? 0 : _sum / _count;Sender.Tell(new CurrentState(q.DeviceId, avg, _count));});// 自動鈍化:與 remember-entities 互斥(見“生產配置”)Context.SetReceiveTimeout(TimeSpan.FromMinutes(5));Receive<ReceiveTimeout>(_ => Context.Parent.Tell(new Passivate(PoisonPill.Instance)));Recover<Ingest>(e => { _sum += e.Value; _count++; });Recover<SnapshotOffer>(s =>{var (sum, cnt) = ((double, long))s.Snapshot;_sum = sum; _count = cnt;});}
}

5.3 Streams 入口 + ACK 閉環(ActorRefWithAck)🔁

// Ingress messages for ACK protocol
public sealed record StreamInit();
public sealed record StreamAck();
public sealed record StreamComplete();
public sealed record StreamFail(Exception Cause);// IngressActor.cs
using Akka.Actor;
using Akka.Cluster.Sharding;public sealed class IngressActor : ReceiveActor
{private readonly IActorRef _region;public IngressActor(IActorRef region){_region = region;Receive<StreamInit>(_ => Sender.Tell(new StreamAck()));         // 握手Receive<Ingest>(msg => { _region.Tell(msg); Sender.Tell(new StreamAck()); }); // 逐條ACKReceive<StreamComplete>(_ => Context.Stop(Self));Receive<StreamFail>(x => { Context.GetLogger().Error(x.Cause, "stream failed"); });}
}
// Streams wiring(Program/Module中)
using Akka.Streams;
using Akka.Streams.Dsl;// 1) Materializer
var mat = SystemMaterializer.Get(system).Materializer;// 2) Source.Queue:入口背壓隊列
var (queue, source) = Source.Queue<Ingest>(bufferSize: 10_000, OverflowStrategy.Backpressure).PreMaterialize(mat);// 3) 將流量通過 ActorRefWithAck 打給 IngressActor(由其負責ACK并Tell到Region)
var ingress = system.ActorOf(Props.Create(() => new IngressActor(region)), "ingress");var ackSink = Sink.ActorRefWithAck<Ingest>(target: ingress,onInitMessage: new StreamInit(),ackMessage: new StreamAck(),onCompleteMessage: new StreamComplete(),onFailureMessage: ex => new StreamFail(ex)
);// 4) 可選:分組/聚合后下發
source.GroupBy(1024, x => x.DeviceId).GroupedWithin(500, TimeSpan.FromMilliseconds(50)).MergeSubstreams().SelectMany(batch => batch) // 批內可先聚合降噪,再下發.RunWith(ackSink, mat);// 在 ABP 層/Controller 中:await queue.OfferAsync(new Ingest(deviceId, value, DateTimeOffset.UtcNow));
5.3.1 端到端背壓閉環 🧨
ClientABP AppServiceSource.QueueIngressActorShardRegionDeviceEntityActorPOST /ingest (deviceId, value)Offer(Ingest)背壓:當下游未ACK時隊列阻塞OfferIngestTell(Ingest)Deliver(Ingest)Persisted (event/snapshot)StreamAckOffer completed (backpressure released)202 AcceptedClientABP AppServiceSource.QueueIngressActorShardRegionDeviceEntityActor

5.4 Akka.Hosting:顯式啟動 Sharding + DI 注入 🧩

// Program.cs / YourAbpModule.ConfigureServices(...)
using Akka.Actor;
using Akka.Cluster.Sharding;
using Akka.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;// Marker type for ActorRegistry (避免直接暴露 ActorRef 原型類型)
public sealed class DeviceRegionKey {}builder.Services.AddAkka("AppSystem", (akka, sp) =>
{// —— 統一日志到 Serilog ——akka.ConfigureLoggers(l =>{l.ClearLoggers();l.AddLogger<Akka.Logger.Serilog.SerilogLogger>();});// —— 開發環境:內存持久化(復制即可跑)——var devHocon = """akka {loglevel = "INFO"actor {provider = "cluster"default-mailbox {mailbox-type = "Akka.Dispatch.BoundedMailbox"mailbox-capacity = 20000mailbox-push-timeout-time = 2s}serializers {hyperion = "Akka.Serialization.HyperionSerializer, Akka.Serialization.Hyperion"}}remote.dot-netty.tcp { hostname = "0.0.0.0", port = 4053 }cluster { seed-nodes = ["akka.tcp://AppSystem@localhost:4053"], roles = ["api"] }persistence {journal.plugin = "akka.persistence.journal.inmem"snapshot-store.plugin = "akka.persistence.snapshot-store.inmem"}cluster.sharding { passivate-idle-entity-after = 5 m }}""";akka.AddHocon(devHocon, HoconAddMode.Append);// —— 顯式啟動 Sharding 并注入 Region —— akka.WithActors((system, registry) =>{var sharding  = ClusterSharding.Get(system);var settings  = ClusterShardingSettings.Create(system);var region = sharding.Start(typeName: "device-entity",entityProps: Props.Create(() => new DeviceEntityActor()),settings: settings,messageExtractor: new DeviceMessageExtractor(shards: 64));registry.TryRegister<DeviceRegionKey>(region);var ingress = system.ActorOf(Props.Create(() => new IngressActor(region)), "ingress");registry.TryRegister<IngressActor>(ingress);});
});

6)與 ABP 應用層對接(IRequiredActor + Ask/Tell)🔗

// DeviceAppService.cs
using Akka.Actor;
using Akka.Hosting;
using Microsoft.Extensions.Configuration;
using Volo.Abp.Application.Services;public class DeviceAppService : ApplicationService
{private readonly IActorRef _region;private readonly IActorRef _ingress;private readonly TimeSpan _askTimeout;public DeviceAppService(IRequiredActor<DeviceRegionKey> region,IRequiredActor<IngressActor> ingress,IConfiguration cfg){_region = region.ActorRef;_ingress = ingress.ActorRef;_askTimeout = TimeSpan.FromSeconds(cfg.GetValue("Akka:AskTimeoutSeconds", 2));}// 寫多:走 Streams 隊列 -> IngressActor(ACK背壓閉環)public async Task IngestAsync(string deviceId, double value){_ingress.Tell(new Ingest(deviceId, value, DateTimeOffset.UtcNow));await Task.CompletedTask;}// 查少:必要時 Ask(統一超時/重試策略)public Task<CurrentState> GetAsync(string deviceId)=> _region.Ask<CurrentState>(new GetCurrent(deviceId), _askTimeout);
}

7)生產切換:SQL Server 持久化 🧱

開發用內存持久化;生產切換到 SQL/PG。以 SQL Server 為例(同理可替換為 PostgreSQL/MySQL,對應 provider-name 也要換成各自 Linq2Db ProviderName)。

# appsettings.Production.hocon(或用 AddHocon Append)
akka {persistence {journal {plugin = "akka.persistence.journal.sql"sql {class = "Akka.Persistence.Sql.Journal.SqlWriteJournal, Akka.Persistence.Sql"connection-string = "Server=localhost;Database=AkkaDemo;User Id=sa;Password=Your_password123;"provider-name = "SqlServer.2019"}}snapshot-store {plugin = "akka.persistence.snapshot-store.sql"sql {class = "Akka.Persistence.Sql.Snapshot.SqlSnapshotStore, Akka.Persistence.Sql"connection-string = "Server=localhost;Database=AkkaDemo;User Id=sa;Password=Your_password123;"provider-name = "SqlServer.2019"}}}# 生產常見:開啟記憶實體,禁用自動鈍化cluster.sharding {remember-entities = on# passivate-idle-entity-after 將被自動禁用}
}

?? 上線前:按官方腳本初始化 Journal/Snapshot 架構與索引
Remember-Entities × 鈍化:開啟 remember-entities=on禁用自動鈍化;需要停用實體,請用 Passivate 顯式停止并取消記憶。🧹


8)序列化與安全(Hyperion)🛡?

akka.actor {serializers {hyperion = "Akka.Serialization.HyperionSerializer, Akka.Serialization.Hyperion"}# 建議只綁定到你的消息基類型,而不是 System.Objectserialization-bindings {"Your.Namespace.IDeviceMsg, Your.Assembly" = hyperion}serialization-settings.hyperion {# 需要時可開啟版本容忍、已知類型等(示例)# version-tolerance = on# knownTypesProvider = "Your.Namespace.KnownTypesProvider, Your.Assembly"}
}

只綁定消息基類型,避免誤序列化;若強 Schema 演進訴求,生產可切 Protobuf。📦


9)Actor 生命周期 🧬

First message for EntityId
Count % 1000 == 0
Snapshot saved
ReceiveTimeout / Manual Passivate
PoisonPill
Re-activation by ShardRegion (on demand)
Idle
Active
Snapshotting
Passivating
Stopped

10)Sharding 重分布 📦

Yes
No
Node Scale-out
Join Cluster
Shard Coordinator Rebalance
Hot Shards?
Move Shards to New Node
Keep Current Placement
Entities Recreated on New Host
State Restore via Events/Snapshots
Traffic Resumes

11)K8s 拓撲 ??

K8s
Deployment:API
Deployment:Worker
Cluster Bootstrap
Cluster Bootstrap
Gossip
Gossip
Service API
Service Management
Pod Worker-1
Pod Worker-2
Pod Worker-3
Pod API-1
Pod API-2
Client

12)可靠性與容錯 🛠?

  • 監督策略:業務可恢復異常 Resume;不可恢復 Restart/Stop
  • 冪等:命令帶 CommandId,Actor 內滑窗去重;
  • 熔斷:外部調用 Actor 使用 CircuitBreaker
  • 死信監控:訂閱 DeadLetter 輸出到 Serilog(報警)。📣

13)可觀測性與日志 📊

  • Akka.Logger.Serilog 與 ABP 的 Serilog 統一;
  • 日志添加 SourceContext=ActorPath 維度,便于過濾;
  • 定期拉取 GetClusterShardingStatsGetShardRegionState 觀測分布/熱點;
  • 流水線指標:入口隊列深度、批量大小、吞吐/延遲、失敗率(Prometheus/OpenTelemetry)。

14)部署:本地多實例 & K8s 🧪

本地/Compose

  • 多進程/容器靜態 seed-nodes
  • 驗證分片重分布、Failover、恢復時間(含快照前后對比)。

Kubernetes

  • Akka.Management + Akka.Discovery.KubernetesApiCluster Bootstrap
  • roles=["api"] / ["worker"] 分層,worker 走 HPA;
  • 健康探針 + Coordinated Shutdown,滾動升級/金絲雀發布。🌈

15)性能調優清單 ?

  1. 分片數:初始 = 總核數 × 2~4,壓測校正(過小→熱點,過大→開銷增)。
  2. 消息體:短小定長;大對象走外部存儲,僅傳引用。
  3. 快照頻率:以“重放時長目標(如 <2s)”反推,起步 500~2000 事件/快照。
  4. Ask 慎用:統一超時/重試策略;寫多路徑優先 Tell
  5. 郵箱一律有界;熱點實體可專用 dispatcher/郵箱。
  6. 背壓閉環:優先 ActorRefWithAck;配合節流/并行度/批量。

16)常見坑 & 規避 🧨

  • ? string.GetHashCode() 做分片哈希 → ? 用 HashCodeMessageExtractor(穩定)。
  • ? Streams 直接 Tell 到 Region → ? 用 ActorRefWithAck/批量 Ask 打通背壓閉環
  • ? System.Object 綁定 Hyperion → ? 只綁定消息基類型,并考慮白名單/演進。
  • ? Remember-Entities 開啟仍指望自動鈍化 → ? 自動鈍化被禁用;需要停用時用 Passivate
  • ? 無界郵箱 → ? 一律有界并觀測隊列深度。
  • ? 亂配 ABP×.NET → ? .NET 8 對應 ABP 8+。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/92901.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/92901.shtml
英文地址,請注明出處:http://en.pswp.cn/web/92901.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[激光原理與應用-250]:理論 - 幾何光學 - 透鏡成像的優缺點,以及如克服缺點

透鏡成像是光學系統中應用最廣泛的技術&#xff0c;其通過折射原理將物體信息轉換為圖像&#xff0c;但存在像差、環境敏感等固有缺陷。以下是透鏡成像的優缺點及針對性改進方案&#xff1a;一、透鏡成像的核心優點高效集光能力透鏡通過曲面設計將分散光線聚焦到一點&#xff0…

測試匠談 | AI語音合成之大模型性能優化實踐

「測試匠談」是優測云服務平臺傾心打造的內容專欄&#xff0c;匯集騰訊各大產品的頂尖技術大咖&#xff0c;為大家傾囊相授開發測試領域的知識技能與實踐&#xff0c;讓測試工作變得更加輕松高效。 本期嘉賓介紹 Soren&#xff0c;騰訊TEG技術事業群質量工程師&#xff0c;負責…

用天氣預測理解分類算法-從出門看天氣到邏輯回歸

一、生活中的決策難題&#xff1a;周末郊游的「天氣判斷」 周末計劃郊游時&#xff0c;你是不是總會打開天氣預報反復確認&#xff1f;看到 "25℃、微風、無雨" 就興奮收拾行李&#xff0c;看到 "35℃、暴雨" 就果斷取消計劃。這個判斷過程&#xff0c;其…

HTTPS服務

HTTPS服務 一、常見的端口 http ------ 80 明文 https ------ 443 數據加密 dns ------ 53 ssh ------ 22 telent ------ 23 HTTPS http ssl或者tls &#xff08;安全模式&#xff09; 二、原理&#xff1a; c&#xff08;客戶端…

【Android筆記】Android 自定義 TextView 實現垂直漸變字體顏色(支持 XML 配置)

Android 自定義 TextView 實現垂直漸變字體顏色&#xff08;支持 XML 配置&#xff09; 在 Android UI 設計中&#xff0c;字體顏色的漸變效果能讓界面看起來更加精致與現代。常見的漸變有從左到右、從上到下等方向&#xff0c;但 Android 的 TextView 默認并不支持垂直漸變。…

CANopen Magic調試軟件使用

一、軟件安裝與硬件連接1.1 系統要求操作系統&#xff1a;Windows 7/10/11 (64位)硬件接口&#xff1a;支持Vector/PEAK/IXXAT等主流CAN卡推薦配置&#xff1a;4GB內存&#xff0c;2GHz以上CPU1.2 安裝步驟運行安裝包CANopen_Magic_Setup.exe選擇安裝組件&#xff08;默認全選&…

前端css學習筆記3:偽類選擇器與偽元素選擇器

本文為個人學習總結&#xff0c;如有謬誤歡迎指正。前端知識眾多&#xff0c;后續將繼續記錄其他知識點&#xff01; 目錄 前言 一、偽類選擇器 1.概念 2.動態選擇器&#xff08;用戶交互&#xff09; 3.結構偽類 &#xff1a;first-child&#xff1a;選擇所有兄弟元素的…

深入探索 PDF 數據提取:PyMuPDF 與 pdfplumber 的對比與實戰

在數據處理和分析領域&#xff0c;PDF 文件常常包含豐富的文本、表格和圖形信息。然而&#xff0c;從 PDF 中提取這些數據并非易事&#xff0c;尤其是當需要保留格式和顏色信息時。幸運的是&#xff0c;Python 社區提供了多個強大的庫來幫助我們完成這項任務&#xff0c;其中最…

Springboot注冊過濾器的三種方式(Order 排序)

一、使用 Component Order&#xff08;簡單但不夠靈活&#xff09; 適用于全局過濾器&#xff0c;無需手動注冊&#xff0c;Spring Boot 會自動掃描并注冊。 Component Order(1) // 數字越小&#xff0c;優先級越高 public class AuthFilter implements Filter {Autowired /…

電腦硬件詳解

前幾天我的風扇轉的很快&#xff0c;而且cpu占用率很高&#xff0c;然后我在想怎么回事&#xff0c;然后就淺淺研究了一下電腦的硬件。 筆記本主板&#xff1a; 臺式機主板&#xff1a; 圖1&#xff1a; 圖2&#xff1a; 電腦硬件詳解 電腦的硬件是組成計算機系統的物理設…

力扣47:全排列Ⅱ

力扣47:全排列Ⅱ題目思路代碼題目 給定一個可包含重復數字的序列 nums &#xff0c;按任意順序 返回所有不重復的全排列。 思路 又是任意順序和所有不重復的排列&#xff0c;顯而易見我們要使用回溯的辦法。 首先是回溯的結束條件即新數組的長度等于nums的長度。這道題的難點…

學習筆記091——如何實現web登錄時,密碼復雜度校驗?(后端)

1、創建工具類 /*** 密碼復雜度校驗* param password 密碼*/ public static void validatePassword(String password) {// 至少8位if (password.length() < 8) {throw new IllegalArgumentException("密碼長度至少為8位");}// 包含大小寫字母if (!password.matche…

雪花算法snowflake分布式id生成原理詳解,以及對解決時鐘回撥問題幾種方案討論

一、前言在日趨復雜的分布式系統中&#xff0c;數據量越來越大&#xff0c;數據庫分庫分表是一貫的垂直水平做法&#xff0c;但是需要一個全局唯一ID標識一條數據或者MQ消息&#xff0c;數據庫id自增就顯然不能滿足要求了。因為場景不同&#xff0c;分布式ID需要滿足以下幾個條…

【PCB設計經驗】去耦電容如何布局?

0805 和 0603 以及更小 封裝的電容用作于對中高頻的去耦,其擺放位置是有要求的: 一、建議盡可能的靠近主控芯片的 電源管腳放置。 二、使用較寬和短的引線連接到電源和地過孔可以采用如下 圖 4–1 中的圖 ( 2 )、( 3)、 ( 4 )任意一種方式,避免使用長線或者較細的…

自動化運維實驗

目錄 一、實驗拓撲 二、實驗目的 三、實驗步驟 實驗思路&#xff1a; 代碼部分&#xff1a; 四、實驗結果&#xff1a; 一、實驗拓撲 二、實驗目的 利用python腳本&#xff0c;在本地&#xff0c;或者虛擬機里實現&#xff0c;設備CRC數量統計&#xff0c;并輸出成表格 三、實驗…

Wed前端第二次作業

一、作業1&#xff1a;完成自己學校的官網&#xff0c;動忘內容直接貼&#xff0c;至少三個不同的頁面1、界面1&#xff08;1&#xff09;相關代碼<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name&quo…

第5節 大模型分布式推理通信優化與硬件協同

前言 在分布式推理中,多設備(如GPU、CPU)之間的數據傳輸(通信)是連接計算的“橋梁”。如果通信效率低下,即使單設備計算能力再強,整體性能也會大打折扣。想象一下:如果工廠之間的物流卡車跑得比生產速度還慢,再多的工廠也無法提高整體產量。 本節將從最基礎的單設備內…

XGBoost 的適用場景以及與 CNN、LSTM 的區別

XGBoost 的核心優勢與適用場景XGBoost 是一種梯度提升決策樹算法&#xff0c;屬于集成學習方法。它在處理結構化/表格化數據方面表現極其出色&#xff0c;是 Kaggle 競賽和工業界廣泛應用的“冠軍”模型。其核心優勢和應用場景包括&#xff1a;1. 結構化/表格化數據數據形式&a…

快速設計簡單嵌入式操作系統(3):動手實操,基于STC8編寫單任務執行程序,感悟MCU指令的執行過程

引言 前面我們陸續學習了操作系統常見的基礎概念&#xff0c;接著簡單了解了一下8051單片機的內存結構和執行順序切換的相關概念。接下來&#xff0c;我們就開始進行實操&#xff0c;基于8051單片機STC8來編寫一個簡單的操作系統&#xff0c;這里我們先實現一個單任務的執行程…

Spring AI Alibaba - 聊天機器人快速上手

本節對應 Github&#xff1a;https://github.com/JCodeNest/JCodeNest-AI-Alibaba/tree/master/spring-ai-alibaba-helloworld 本文將以阿里巴巴的通義大模型為例&#xff0c;通過 Spring AI Alibaba 組件&#xff0c;手把手帶你完成從零到一的構建過程&#xff1a;首先&#…