我正在try 使用Pusher通道从我的服务器向我的用户发送消息.我的API收到一个用户列表,消息需要发送给列表中的所有用户.我不能将这些用户分组到单个频道中,每个用户都必须使用一个单独的频道.这会使我的API变慢,因为用户列表的大小可以在1到10000之间(future 可能更大),而推送器批处理事件只能接受大小为10的事件列表.

我正在使用.Net 6作为我的API

我try 使用batch events来try 提高性能;我的代码如下所示,

var events = new List<Event>();
// count can be anything between 1 and 10000
for (int i = 1; i <= count; i++)
{
    // creating a sample list of events
    events.Add(new Event
    {
        Channel = string.Format("batch-channel-{0}", i),
        EventName = "batch-event",
        Data = new
        {
            Channel = string.Format("batch-channel-{0}", i),
            Event = "batch-event",
            Message = string.Format("{0} - sample message", i)
        {
    });
}
var result = new List<HttpStatusCode>();
int chunkSize = 10;
int totalChunks = (int)Math.Ceiling((double)events.Length / chunkSize);
for (int i = 0; i < totalChunks; i++)
{
    var eventsChunk = events.Skip(i * chunkSize).Take(chunkSize).ToArray();
    // publishing event lists of size 10
    var chunkResult = await pusher.TriggerAsync(eventsChunk);
    result.Add(chunkResult.StatusCode);
}

我用一个大小为10000的事件列表测试了这段代码,它大约需要6分钟才能完成执行.我想知道我是否遗漏了什么,以及我是否可以以某种方式提高表现.

如有任何帮助,我们不胜感激.谢谢.

推荐答案

如果要将同一事件发送到多个频道,则可以使用标准触发器端点,但指定要广播到的频道列表.例如:

using PusherServer;

var options = new PusherOptions();
options.Cluster = "APP_CLUSTER";
var pusher = new Pusher("APP_ID", "APP_KEY", "APP_SECRET", options);

ITriggerResult result = await pusher.TriggerAsync(
  new string[]{"my-channel-1", "my-channel-2", "my-channel-3"},
  "my-event",
  new { message: "hello world" });

这将触发对三个指定通道的事件.在一次发布中最多可以指定100个通道.

如果您要向每个通道发送不同的事件,那么您提到的Batch Event端点将是前进的方向.在这种情况下,您可能会考虑使用多线程或类似的方法,以便能够同时处理多个批处理触发器,而不是按顺序处理.

来源-https://pusher.com/docs/channels/server_api/http-api/#example-publish-an-event-on-multiple-channels

.net相关问答推荐

为什么$NULL在ForEach-Object{}和Foreach()中的行为不同?

Azure SignalR 和微服务

正则表达式匹配 URL 中的多个子目录

在接口内部声明 IEnumerable 而在具体类中声明 IList

编译时禁用 Dll 文化文件夹

从 switch 块中跳出 foreach 循环

是什么让 Enum.HasFlag 这么慢?

如何对无法加载的 VSTO 插件进行故障排除?

如何禁用 Alt + F4 关闭表单?

如何允许程序集(单元测试)访问另一个程序集的内部属性?

无法使用 Unity 将依赖项注入 ASP.NET Web API 控制器

覆盖 ASP.NET MVC 中的授权属性

如何从 .NET 读取 PEM RSA 私钥

C# 中的 F# List.map 类似功能?

我应该如何删除 DbSet 中的所有元素?

如何找到二维数组的大小?

如何获取命名空间中的所有类?

如何使用 DateTime 指定一天中的最晚时间

IEnumerable vs IReadonlyCollection vs ReadonlyCollection 用于公开列表成员

序列化一个可为空的 int