あまみや ゆうこ » BACKEND

Pomelium——.NET Core下轻量级RPC框架

Background

最近在和朋友开发一款基于Unity 3D的游戏,技术栈选择了.NET Core写服务端、Unity3D写客户端,通过某种手段,已经实现了Unity对C# 6.0的支持,因此可以在Unity里愉快的使用异步函数等功能了。那么现在就要确定通讯协议了,首先虽然Unity对C# 6.0支持了,但是并不代表对netfx有完整的支持,因此无法使用SignalR,TCP协议又显得太过苍白,WCF又太heavy,所以决定造一发轮子。

Pomelium

Pomelium基于TCP协议开发,包内容为前4字节表示正文长度,正文则是一个json字符串。通过简单的协议进行服务端 call 客户端及客户端 call 服务端的操作。

此外,Pomelium还提供了类似WEB开发中的Session功能、Group机制等,开发者可以使用Pomelium进行更加灵活的开发。

Pomelium支持通过Microsoft.Extensions.Cache.Distributed.IDistrbutedCache来Scale out,构建分布式Pomelium服务器集群。支持开发者进行跨服务器的客户端方法调用等。

Getting Started

① 首先向服务端项目中添加Pomelo.Net.Pomelium.Server的引用。

更多内容 »

Published on 1/31/2017 6:20:14 AM

异步广度优先搜索算法

为什么要异步?

CPU的工艺越来越小,Cannon Lake架构的Intel CPU已经达到10nm技术,因此在面积不变的情况下,核心数可以明显提升。单纯的提升主频将造成发热量大、需要的电压大、功耗大的问题。而传统的算法与数据结构是针对单核心单线程同步而言的,因此,传统的算法无法将CPU利用率达到最大。

广度优先搜索

首先我们先了解一下与之对应的深度优先搜索(DFS),深度优先搜索即像走迷宫时,始终保持左手与左侧墙壁接触,换言之即遇到岔路时永远向左拐,从而寻找出口。而广度优先搜索,则在每个岔路时,变出一个分身,继续前进。

但是,实际上是这样吗?答案是否定的,刚刚已经讲到,传统的算法与数据结构是建立在单线程同步基础上的,因此传统算法只能够模拟分身在同时前进,这时就要引入队列来保存和展开岔路节点(当遇到新岔路时,将这个节点放入队列。队列头部元素进行展开寻找新的岔路并放入队列尾部)。

基于Parallel的并行广度优先搜索

而在并行或异步以及多线程的环境下,我们可以真的让“分身”们同时前进。首先使用并行广度优先搜索的前提是你不在意真的保证了广度是同步的,虽然并行广度优先搜索能够寻找到全部解,但是无法保证同一时刻进行搜索的任务是在同一深度的。

在这一前提下,我们以遍历图为例,首先定义邻接表的数据结构:

更多内容 »

Published on 1/15/2017 9:21:44 AM

搭建分布式 ASP.NET Core Web

单台Web处理用户请求的能力是有限的,因此我们可能会需要搭建分布式的Web服务器。

当前市面上,可能用的比较多的是会话保持,这种模式下,开发者只需将先前开发好的、不支持会话共享的程序部署在多台服务器上,负载均衡提供商会要求开发者设置保持时间,就可以完成部署。但其缺点是仅仅将用户分配到不同节点,不是将请求分配到不同节点,粒度过大,会导致负载不够均衡。

下面我们从各个角度介绍一下如何让你的ASP.NET Core网站系统摆脱会话保持

Session Sharing

分布式Web的第一大棘手问题就是登录状态。ASP.NET Core中默认是将Session ID进行保护的,因此这些数据是被加密过的,并以xml文件形式存在保护区,因此我们要将这个文件共享出来。

因此我们需要实现Session Sharing,对于不同平台,我们有不同的做法(在ASP.NET Core 1.1.0发布前,我们只能通过文件系统进行共享):

Windows

在Windows中,我们使用UNC路径来实现共享。首先建立一个文件夹,在共享中赋予Guest用户读写权限。

更多内容 »

Published on 10/10/2016 11:49:03 AM

Ubuntu 14.04下配置用于缓存目的的Redis

对于我这个万年不搞运维的人,终于轮到我了。。。

安装

官网提供了最新源代码的下载地址,我们需要在Ubuntu上编译。

# wget http://download.redis.io/releases/redis-3.2.3.tar.gz
# tar xzf redis-3.2.3.tar.gz
# cd redis-3.2.3
# make

② 在/etc下创建redis文件夹,将第一步中解压的redis.conf复制到/etc/redis文件夹中。

更多内容 »

Published on 8/9/2016 2:59:30 AM

被玷污的.NET架构

今天和朋友探讨了一下.NET架构,由于我一直反对抽service的行为,因此希望了解一下这些架构师的想法,可惜这些人是没想法的。

从讨论中得出似乎这样的行为是先前微软误导的,怪我当年没有看微软官方Sample咯,不过现在微软也在修正这样的问题,比如推出的MusicStore的架构就是非常合理的。

至于要共享App的Restful API和Web UI的数据库操作逻辑,我的结论是这样的:完全可以用ApiController做Web API,前端使用AngularJS,这样APP继续调用API。这样的架构也没有为项目增加繁琐的层次,也没有因为层次过于繁琐带来的效率低下、难于维护等问题。

其实,到了MVC时代,微软提供的MusicStore已经不再抽service了,是一些万恶的java开发人员玷污了这片净土!难道不是吗,你们自己看搞java的现在还在那MVC~Service。本人很不理解一些搞java的,根本不了解.NET文化,缺大肆出版.NET教程来误导开发者,真是够了。。。

file

file

file

file

更多内容 »

Published on 7/21/2016 3:24:03 PM