千家信息网

Ray-Handler消息订阅器编写方法是什么

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇内容主要讲解"Ray-Handler消息订阅器编写方法是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Ray-Handler消息订阅器编写方法是什
千家信息网最后更新 2026年11月01日Ray-Handler消息订阅器编写方法是什么

本篇内容主要讲解"Ray-Handler消息订阅器编写方法是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Ray-Handler消息订阅器编写方法是什么"吧!

消息订阅器:

Ray是基于Event Sourcing设计的ES/Actor框架,消息发布后需要订阅处理,订阅器主要有以下两类:

  • CoreHandler消息订阅器=RabbitSub+SubHandler

  • ToReadHandler消息订阅器=RabbitSub+SQLToReadHandler(ToReadHandler的子类)

    RabbitSub特性

RabbitSub特性是RabbitMQ消息队列订阅器。

RabbitSub特性有两个构造函数,常用的是这个:

public RabbitSubAttribute(string group, string exchange, string queue, int queueCount = 1)
  • group:通常用于分类。示例中,X-CoreHandler的group是Core,X-ToReadHandler是Read。

  • exchange:RabbitMQ中的exchange名称。

  • queue:RabbitMQ中的queue名称。

  • queueCount:消息队列数。用于消息的负载均衡。

示例:

[RabbitSub("Core", "Account", "account")]public sealed class AccountCoreHandler : SubHandler{    ……}

RabbitSub可以单独使用,用于订阅消息。


CoreHandler消息订阅器

Ray中的ESActor通过RaiseEvent方法发布事件,传递消息。Ray默认使用RabbitMQ传递消息。ESActor发起事件后,CoreHandler订阅事件,以处理事件。

实现方式是:

  • 继承SubHandler。

  • 添加RabbitSub特性。 exchange名称、queue名称与ESGrain上RabbitPub特性的标识一致。

  • 添加构造函数(必须)。

    public AccountCoreHandler(IServiceProvider svProvider) : base(svProvider){}
  • 事件被订阅后会流转到Tell方法中,data是要处理的事件。

    public override Task Tell(byte[] bytes, IActorOwnMessage data, MessageInfo msg){   switch (data)   {       case AmountTransferEvent value: return Task.WhenAll(task, AmountAddEventHandler(value));       default: return task;   }}
    ToReadHandler消息订阅器
  1. SQLToReadHandler

ESActor发起事件后,X-ToReadHandler订阅事件,以处理事件。X-ToReadHandler继承自X-SQLToReadHandler,X-SQLToReadHandler继承自ToReadHandler。

X-SQLToReadHandler需要使用者继承PartSubHandler,根据使用的关系型数据库自己实现。Ray默认提供了PostgreSQL的PSQLToReadHandler。如果使用的是MySQL、SQL Server等其他关系型数据库,请自定义实现。

X-SQLToReadHandler实现细节:
修改对应关系型数据库的Integrity Constraint Violation(违反完整性约束)的异常。
可以将实例中PSQLToReadHandler当做X-ToReadHandler模板,修改if (!(t.Exception.InnerException is Npgsql.PostgresException e && e.SqlState == "23505"))即可。


说明:

当X-ToReadHandler订阅消息,消息有重放的场景,如果该消息已经得到处理,数据库中已经存在其处理后的结果,这是可能会报Integrity Constraint Violation(违反完整性约束)异常,默认不做处理,其他异常将其抛出,这是这段代码的作用。


示例模板:

public abstract class PSQLToReadHandler : PartSubHandler{    public PSQLToReadHandler(IServiceProvider svProvider) : base(svProvider)    { }    public override Task Notice(byte[] data)    {        return base.Notice(data).ContinueWith(t =>        {            if (t.Exception != null)            {                //根据使用数据库,修改这个if判断                if (!(t.Exception.InnerException is Npgsql.PostgresException e && e.SqlState == "23505"))                {                    throw t.Exception;                }            }        });    }}

2. X-ToReadHandler
X-ToReadHandler订阅器主要用于订阅感兴趣的消息,将数据写入到数据库中。

实现方式是:

  • 实现SQLToReadHandler

  • ToReadHandler继承SQLToReadHandler(ToReadHandler的子类)

  • 添加RabbitSub特性。

  • 添加构造函数(必须),在构造函数中注册关注的事件。

    public AccountToReadHandler(IServiceProvider svProvider) : base(svProvider){  Register();  Register();}

    代码如下所示:

[RabbitSub("Read", "Account", "account")]public sealed class AccountToReadHandler : PSQLToReadHandler{    public AccountToReadHandler(IServiceProvider svProvider) : base(svProvider)    {        Register();        Register();    }}
X-ToReadHandler消息订阅器与CoreHandler消息订阅器差异

X-ToReadHandler消息订阅器使用时,需要在构造函数中注册关心的事件,而X-CoreHandler中不需要,原因是事件在处理中需要反序列化,X-CoreHandler会对RabbitSub参数指定订阅的所有的消息反序列化,X-ToReadHandler在此基础上做了进一步的控制,在订阅的消息中只对Register的事件处理。这样做的原因:1.反序列化会消耗一定的性能,进一步控制有助于提高性能;2.Ray提供两种实现方式,为开发者扩展自定义源码提供借鉴。

到此,相信大家对"Ray-Handler消息订阅器编写方法是什么"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

消息 订阅 事件 处理 数据 方法 数据库 特性 函数 名称 序列 方式 示例 代码 兴趣 内容 原因 子类 完整性 性能 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 科技互联网产品 厦门中拓互联网络科技有限公司 中资互联网科技 互联网科技股票 世界互联网领先科技成果 迪茉互联网科技 宜安科技 互联网金融 伴你行互联网科技有限公司 深圳期待互联网科技 阿里互联网科技公司 互联网企业和科技型企业 中化能源互联网科技招聘 互联网经济与金融科技 电子科技大学互联网创业大赛 西安小鹰速贷互联网科技有限公司 郑州欣桑互联网科技有限公司 福建互联网展示科技馆设计 互联网高科技行业有哪些企业 河南商务圈互联网科技有限公司 科技互联网企业在行动 厦门中拓互联网络科技有限公司 互联网通讯科技 西安互联网科技 重庆科技学院互联网 深圳互联网科技怎么样 互联网系的金融科技公司 语蝶互联网科技有限公司 佛山市翊博互联网络科技有限公司 上海创道互联网络科技有限公司 容联科技互联网电商
0