Example #1
0
        private async Task ProcessGroupMessageAsync(StackExchange.Redis.IDatabase db, string groupName)
        {
            List <GroupMessageResp> msgs = new List <GroupMessageResp>();
            Stopwatch stopwatch          = new Stopwatch();

            stopwatch.Start();
            //要么没有更多待发消息立即发给客户端
            //要么累积满1秒钟待发消息后发送给客户端
            while (true)
            {
                //弹出一条待发送消息
                string jsonStr = await db.ListRightPopAsync($"{groupName}_MessagesWaitToSent");

                if (jsonStr != null)
                {
                    //加入群发消息组
                    var msg = JsonConvert.DeserializeObject <GroupMessageResp>(jsonStr);
                    msgs.Add(msg);
                }
                else
                {
                    await Task.Delay(10);
                }
                //满一段时间的消息就向客户端发一组
                if (stopwatch.Elapsed > TimeSpan.FromSeconds(0.5))
                {
                    stopwatch.Stop();
                    //把积累的一组数据发给客户端
                    if (msgs.Any())
                    {
                        logger.LogWarning("过去了{0}准备向{1}发送一批消息,条数{2}", stopwatch.Elapsed, groupName, msgs.Count);
                        //如果一个周期内消息太多,则只发送一部分,其他的丢弃,以避免造成一次性发给客户端的消息太多
                        await this.hubContext.Clients.Group(groupName).SendAsync("OnGroupMessages", msgs.Take(20));

                        logger.LogWarning("完成向{0}发送一批消息,条数{1}", groupName, msgs.Count);
                    }
                    return;//本轮巡查完毕
                }
            }
        }