前言

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

    主要是在使用Fragment时能够返回前一级,所以才找到了这些资料. 有两种方式可以实现,直接上代码 方法1: public void onBack(){ new Thread(){ public v ...

  2. 逃生(反向topo)

    逃生 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status De ...

  3. Oracle TNS Listener Remote Poisoning

    Oracle TNS Listener Remote Poisoning 远程数据投毒漏洞(CVE-2012-1675) 1.漏洞简介: 允许攻击者在不提供用户名/密码的情况下,向远程“TNS Lis ...

  4. [ActionSprit 3.0] FMS远程共享

    package { import flash.display.Sprite; import flash.events.NetStatusEvent; import flash.events.SyncE ...

  5. 3,ThreadGroup 的使用场景以及用法

    1 一个大型任务,可分成多个独立的子线程并发进行,最后等待所有的子线程执行结束然后继续往下执行, 使用场景比如 要查找某个用户的最近三个月的通话记录,起 3 个子线程,分别查找最近三个月的记录,然后通 ...

  6. H5新手教程,小白来看看。

    H5教程(一) 相信点进来看这篇文章的应该都是刚刚接触H5的新手,那么你真的是找到了一篇合适的文章. 1.学习前准备 既然想学习好H5,只是这样看是不够的,还需要动手练习,以及及时复习,所以我推荐几款 ...

  7. Angularjs和Ionic框架搭建webApp

    本文原创版权归 简书作者 噜啦啦噜啦啦噜啦噜啦噜 所有,转载请联系作者获得授权,并于文章开头标注原创作者及出处,以示尊重! 文/噜啦啦噜啦啦噜啦噜啦噜(简书作者)原文链接:http://www.jia ...

  8. scrapy连接MongoDB

    Scrapy中连接MongoDB所需要做的工作如下: 1.settings中需要设置的部分: # 启动管道组件 ITEM_PIPELINES = { 'QianChengWuYu.mongoDBPip ...

  9. luogu3292 [SCOI2016]幸运数字

    link 题目大意:给一棵树,每个点有个权值,N<=2万 20万次询问,每次询问查询某两个点路径上所有点的权值xjb异或的最大值 首先看到xjb异或就可以断定是线性基了 并且由于这是树上问题我们 ...

  10. 玩转MongoDB

    一.主从复制 1)首先主从服务器在启动的时候,分别要设置master.slave选项,对于slave可以启动中设置源,也可以在启动后设置源. 如:主:mongod --dbpath=/data/mon ...