前言

首先我现在是在一家游戏工作做服务端的,这几天我们服务端游戏做了整个底层框架的替换,想必做过游戏的也都知道,在游戏里面会有很多的日志需要记录,量也是比较大的;在没有换框架之前我们存日志和游戏运行都是在一套框架里面的,所以做起来比较冗余,也会给游戏服务器带来比较大的压力;现在在这套框架就是把存日志的单独分开做了起来;最后我们老大就选择了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轻量级消息队列的更多相关文章

  1. Web应用中的轻量级消息队列

    Web应用中为什么会需要消息队列?主要原因是由于在高并发环境下,由于来不及同步处理,请求往往会发生堵塞,比如说,大量的insert,update之类的请求同时到达mysql,直接导致无数的行锁表锁,甚 ...

  2. redisTemplate实现轻量级消息队列, 异步处理excel并实现腾讯云cos文件上传下载

    背景 公司项目有个需求, 前端上传excel文件, 后端读取数据.处理数据.返回错误数据, 最简单的方式同步处理, 客户端上传文件后一直阻塞等待响应, 但用户体验无疑很差, 处理数据可能十分耗时, 没 ...

  3. 轻量级消息队列 Django-Q 轻度体验

    前言 最近做的这个项目(基于Django),需要做个功能,实现定时采集车辆定位. 这让我想起来几年前那个OneCat项目,当时我用的是Celery这个很重的组件 Celery实在是太重了,后来我做公众 ...

  4. 消息队列kafka

    消息队列kafka   为什么用消息队列 举例 比如在一个企业里,技术老大接到boss的任务,技术老大把这个任务拆分成多个小任务,完成所有的小任务就算搞定整个任务了. 那么在执行这些小任务的时候,可能 ...

  5. 开源消息队列:NetMQ

    NetMQ 是  ZeroMQ的C#移植版本. ZeroMQ是一个轻量级的消息内核,它是对标准socket接口的扩展.它提供了一种异步消息队列,多消息模式,消息过滤(订阅),对多种传输协议的无缝访问. ...

  6. 消息队列NetMQ 原理分析1-Context和ZObject

    前言 介绍 NetMQ是ZeroMQ的C#移植版本,它是对标准socket接口的扩展.它提供了一种异步消息队列,多消息模式,消息过滤(订阅),对多种传输协议的无缝访问. 当前有2个版本正在维护,版本3 ...

  7. 消息队列NetMQ 原理分析2-IO线程和完成端口

    消息队列NetMQ 原理分析2-IO线程和完成端口 前言 介绍 目的 IO线程 初始化IO线程 Proactor 启动Procator线程轮询 处理socket 获取超时时间 从完成端口获取处理完的状 ...

  8. 消息队列NetMQ 原理分析3-命令产生/处理和回收线程

    消息队列NetMQ 原理分析3-命令产生/处理和回收线程 前言 介绍 目的 命令 命令结构 命令产生 命令处理 创建Socket(SocketBase) 创建连接 创建绑定 回收线程 释放Socket ...

  9. 消息队列NetMQ 原理分析4-Socket、Session、Option和Pipe

    消息队列NetMQ 原理分析4-Socket.Session.Option和Pipe 前言 介绍 目的 Socket 接口实现 内部结构 Session Option Pipe YPipe Msg Y ...

随机推荐

  1. UML uml高级知识之用例图

    uml高级知识之用例图 建模工具推荐使用 visio2010: include:选择菜单栏中的'UML'->单击’构造型‘->新建->构造型那里输入include->基类那里选 ...

  2. APIO2012 派遣dispatching | 左偏树

    题目链接:戳我 就是尽可能地选取排名小的,加起来就可以了.然后我们考虑利用一个大根堆,一个一个合并,如果超过派遣的钱,我们就把费用最大的那个忍者丢出队列. 左偏树,作为一个十分优秀的可并堆,我们这道题 ...

  3. 牛客网提高组模拟赛第七场 T3 洞穴(附bitset介绍)

    就是DP. 我们可以很简单的想到要枚举中间点,进行边数的转移. 但是因为边长数据范围很大,所以我们考虑log的倍增. 状态设计为\(dp[i][j][k]\),为从节点\(i\)走\(2^k\)步能否 ...

  4. java数据库学习

    //编写db类/* a加载驱动 驱动类要全路径 包名+类名 suround with try/catch * b设置参数url user pwd * c.连接数据库(import 'Connectio ...

  5. 比较旧的写法:验证车牌、手机号、电话、qq等

    1.验证车牌代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  6. 百度直接搜IP可以查看本机外网IP

    百度直接搜IP可以查看本机外网IP ipconfig在控制台查看的是内网IP

  7. PL/SQL数据库开发那点事

    PL/SQL数据库开发那点事-->编程,存储程序 在SQL*plus 中编写PL/SQL程序,并在SQL*plus 中执行它, PL/SQL块的代码就存放在SQL*plus的缓冲区中.如果在SQ ...

  8. 基于Java软引用机制最大使用JVM堆内存并杜绝OutOfMemory

    题记:说好的坚持一周两篇文章在无数琐事和自己的懒惰下没有做好,在此表达一下对自己的不满并对有严格执行力的人深表敬意!!!! -------------------------------------- ...

  9. 机器学习 - ML + 深度学习 - DL

    机器学习 CNCC - 2016 | 机器学习(原文链接) Machine Learning - ML,机器学习起源于人工智能,是AI的一个分支. 机器学习的理论基础:计算学习理论 - Computa ...

  10. 通过Nginx部署Django

    Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式. 在这种方式中,我们的通常做法是,将nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求.ng ...