using System.Threading.Channels;
namespace Service.Implement
{
///
/// 告警通知事件(AlertId:告警消息Id;IsNewAlert:是否新告警,false 表示合并触发的重复告警)
///
/// 告警消息 Id
/// 是否新告警
public record AlertNotifyEvent(long AlertId, bool IsNewAlert);
///
/// 告警通知内存总线(生产者:AlertCenterService 上报告警后入队;消费者:AlertNotifyWorker 后台推送)
/// 采用静态单例 Channel,与项目 SqlSugarContext.DbContext 静态单例风格一致;
/// 进程重启丢失队列可接受(告警已落库,页面仍可查询处理)
///
public static class AlertNotifyBus
{
private static readonly Channel _channel =
Channel.CreateUnbounded(new UnboundedChannelOptions
{
SingleReader = true,
SingleWriter = false
});
///
/// 队列读取端(供 AlertNotifyWorker 消费)
///
public static ChannelReader Reader => _channel.Reader;
///
/// 发布告警通知事件(非阻塞,队列满不会发生——无界队列)
///
public static void Publish(long alertId, bool isNewAlert)
{
_channel.Writer.TryWrite(new AlertNotifyEvent(alertId, isNewAlert));
}
}
}