NetMQ:.NET轻量级消息队列
前言
首先我现在是在一家游戏工作做服务端的,这几天我们服务端游戏做了整个底层框架的替换,想必做过游戏的也都知道,在游戏里面会有很多的日志需要记录,量也是比较大的;在没有换框架之前我们存日志和游戏运行都是在一套框架里面的,所以做起来比较冗余,也会给游戏服务器带来比较大的压力;现在在这套框架就是把存日志的单独分开做了起来;最后我们老大就选择了NetMQ, 之前没有接触过NetMq 但是总体也是完成了这个日志服务器的编写,所以在这里也是分享了一下;
什么是NetMQ
简单说就是ZeroMQ的.net开源版本 吊炸天的速度你懂的
下载NetMQ
Install-Package NetMQ
Demo
1) 客户端
using Games.BaseModel.LogEntities;
using NetMQ;
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary; namespace NetMQTest
{
class Program
{
static void Main(string[] args)
{
Run();
Console.ReadLine();
} public static void Run()
{
using (var ctx = NetMQContext.Create())
using (var sender = ctx.CreatePushSocket())
{
sender.Connect("tcp://192.168.1.138:5556");
for (int i = ; i < ; i++)
{
using (var sm = new MemoryStream())
{
var entityLog = new LoginLog { IP = "192.168.1.1", RoleName = "测试", Acc = "test", FromPlat = "" };
var binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize(sm, entityLog);
var content = sm.ToArray();
sender.Send(content);
}
Console.WriteLine(i);
}
}
}
}
}
2)服务端(这里面是我真是游戏里面所用到的,基本意思和原理是一样的,对于不同的场景需要自己进行修改)
using Games.BaseModel.LogEntities;
using Games.DBHandler;
using Games.DBHandler.Dapper;
using Games.Model.ConfigEntities;
using NetMQ;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Threading.Tasks; namespace NetMQ_Code
{
public class Program
{
private static ServerConfigNew _serverConfig; private static IDataAccessor _dataAccessor; private static string _connection; private static readonly Dictionary<string, IDataAccessor> DicServerConfigNew = new Dictionary<string, IDataAccessor>(); private static void Main(string[] args)
{
Console.WriteLine("NetMQ准备启动 . . . ");
_connection = ConfigurationManager.ConnectionStrings["Config"].ConnectionString;
Task task = new Task(Function);
task.Start();
Console.WriteLine("启动成功!");
Console.ReadKey(); } private static void Function()
{
using (NetMQContext ctx = NetMQContext.Create())
{
//接收消息的套接字
using (var receiver = ctx.CreatePullSocket())
{
receiver.Bind("tcp://*:5556");
//处理任务
while (true)
{
var receivedBytes = receiver.Receive();
using (var sm = new MemoryStream(receivedBytes, , receivedBytes.Length))
{
//采用二进制方式
var binaryFormatter = new BinaryFormatter();
sm.Position = ;
var entity = binaryFormatter.Deserialize(sm) as LogEntity;
var serverId = entity.ServerID;
if (DicServerConfigNew.ContainsKey(serverId))
{
EntitySchemaSet.InitSchema(entity.GetType());
DicServerConfigNew.TryGetValue(serverId, out _dataAccessor);
_dataAccessor.SaveLog(entity);
}
else
{
_serverConfig = DapplerUtil.Instance.Query<ServerConfigNew>(_connection, "SELECT * FROM ServerConfig where Id=" + serverId).FirstOrDefault();
if (_serverConfig != null)
{
EntitySchemaSet.InitSchema(entity.GetType());
using (_dataAccessor = DataAccessorFactory.Instance.CreateAccessor("Game", _serverConfig.GameDBConnection, DbProviderType.MsSql))
{
DicServerConfigNew.Add(serverId, _dataAccessor);
_dataAccessor.SaveLog(entity);
}
}
else
{
Console.WriteLine("serverConfig is null");
}
}
Console.WriteLine("Insert:" + entity.GetType());
}
}
}
}
}
}
}
运行结果

总结
NetMQ目前还不支持持久化消息,所以,可靠性不是特别高.消息队列基本的特性都满足,效率也很高.
NetMQ:.NET轻量级消息队列的更多相关文章
- Web应用中的轻量级消息队列
Web应用中为什么会需要消息队列?主要原因是由于在高并发环境下,由于来不及同步处理,请求往往会发生堵塞,比如说,大量的insert,update之类的请求同时到达mysql,直接导致无数的行锁表锁,甚 ...
- redisTemplate实现轻量级消息队列, 异步处理excel并实现腾讯云cos文件上传下载
背景 公司项目有个需求, 前端上传excel文件, 后端读取数据.处理数据.返回错误数据, 最简单的方式同步处理, 客户端上传文件后一直阻塞等待响应, 但用户体验无疑很差, 处理数据可能十分耗时, 没 ...
- 轻量级消息队列 Django-Q 轻度体验
前言 最近做的这个项目(基于Django),需要做个功能,实现定时采集车辆定位. 这让我想起来几年前那个OneCat项目,当时我用的是Celery这个很重的组件 Celery实在是太重了,后来我做公众 ...
- 消息队列kafka
消息队列kafka 为什么用消息队列 举例 比如在一个企业里,技术老大接到boss的任务,技术老大把这个任务拆分成多个小任务,完成所有的小任务就算搞定整个任务了. 那么在执行这些小任务的时候,可能 ...
- 开源消息队列:NetMQ
NetMQ 是 ZeroMQ的C#移植版本. ZeroMQ是一个轻量级的消息内核,它是对标准socket接口的扩展.它提供了一种异步消息队列,多消息模式,消息过滤(订阅),对多种传输协议的无缝访问. ...
- 消息队列NetMQ 原理分析1-Context和ZObject
前言 介绍 NetMQ是ZeroMQ的C#移植版本,它是对标准socket接口的扩展.它提供了一种异步消息队列,多消息模式,消息过滤(订阅),对多种传输协议的无缝访问. 当前有2个版本正在维护,版本3 ...
- 消息队列NetMQ 原理分析2-IO线程和完成端口
消息队列NetMQ 原理分析2-IO线程和完成端口 前言 介绍 目的 IO线程 初始化IO线程 Proactor 启动Procator线程轮询 处理socket 获取超时时间 从完成端口获取处理完的状 ...
- 消息队列NetMQ 原理分析3-命令产生/处理和回收线程
消息队列NetMQ 原理分析3-命令产生/处理和回收线程 前言 介绍 目的 命令 命令结构 命令产生 命令处理 创建Socket(SocketBase) 创建连接 创建绑定 回收线程 释放Socket ...
- 消息队列NetMQ 原理分析4-Socket、Session、Option和Pipe
消息队列NetMQ 原理分析4-Socket.Session.Option和Pipe 前言 介绍 目的 Socket 接口实现 内部结构 Session Option Pipe YPipe Msg Y ...
随机推荐
- 使用PHPstudy在Windows服务器下部署PHP系统
PHP网站一般运行在Apache服务器上,IIS服务器上也可以运行,但是不推荐,windows服务器上没有集成Apache跟PHP的运行环境,但是借助第三方的软件就能很好的搞定,一般这样的软件有很多, ...
- xmlns 与 targetNamespace 的解释
test.xsd文件: <?xml version="1.0" encoding="UTF-8"?> <xs:schema elementFo ...
- UWP平台Taglib编译(2)
此文已由作者郑博授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验 #endif // _WIN32 } class FileStream::FileStreamPrivate ...
- javascript小数求整
Math.ceil(arg) 返回一个比参数arg大的整数 Math.floor(arg) 返回一个比参数arg小的整数 Math.round(arg) 返回一个参数arg四舍五入的后的整数 pars ...
- ATX 免越狱调试IOS和Android
利用ATX配合WDA进行图形识别+自动化测试 通过使用AutomatorX,配合WebDriverAgent,可以实现在非越狱的IOS设备上更简单的进行自动化测试.同样,Android设备一样受到支持 ...
- [BZOJ]4650 优秀的拆分(Noi2016)(哈希+二分)
传送门 题解 听说大佬们这题都是用SA秒掉的 然而SA的时间复杂度的确很优秀,缺点就是看不太懂…… 然后发现一位大佬用哈希华丽的过了此题,而且讲的特别清楚->这里 我们只要考虑以每一个点结尾 ...
- Spark - 经典案例
初识 Spark 大数据处理,目前还只是小白阶段,初步搭建起运行环境,慢慢学习之. 本文熟悉下 Spark 数据处理的几个经典案例. 首先将 Scala SDK 的源码导入 IDEA,方便查看和调试代 ...
- 2016级算法第五次上机-B.Bamboo&APTX4844魔发药水
Bamboo&APTX4844魔发药水 题意 "于是,Bamboo耐着性子,看巫师从袖子里掏出 M 瓶时光泉水和 K 粒绿色能量.每瓶时光泉水重量为 c ,生发效果为 l:每粒绿色能 ...
- css实现渐变
.gradient{ background: -webkit-gradient(linear, 0 0, 0 100%, from(#8ca0d3), to(#375a9a)); /** Chrome ...
- POJ_3368 Frequent values 【线段树+区间查询】
一.题面 POJ3368 二.分析 仍然是一道只需要区间查询不需要区间修改的线段树题. 这题的题面比较特别,它是一组非减的数组.当需要去找一段区间内出现次数最多的数字时,这些数字必然是连续的,那么就可 ...