Fork me on GitHub
摘要: Redola.Rpc 是一个基于 C# 的轻量级 RPC 框架,源代码托管在 GitHub 上,并且发布了 nuget.org 上的可安装软件包。Redola.Rpc 基于 Cowboy.Sockets 进行构建,使用 TCP Socket 进行服务间通信,默认使用 .NET APM TCP Socket 模式。通过 Actor 模型抽象封装 Socket 连接与交互,实现 Actor 之间的 Register、Lookup、Handshake、KeepAlive 等功能;Actor Peer 与 Actor Peer 之间通过 TCP 长连接进行通信。Actor 封装了 TCP 中关于 TcpClient 和 TcpServer 的抽象,对外不再暴露 Client 和 Server 的概念,仅以 Peer 呈现,Peer 与 Peer 之间是平等的。Actor Master 与其他 Peer 的区别仅是承担了 Register 和 Lookup 的职责。Actor Peer 间通过 Actor Master 查询到需要通信的对端 Actor Peer 的 Actor Identity阅读全文
posted @ 2016-10-25 18:33 匠心十年 阅读(876) 评论(12) 编辑
摘要: Cowboy.WebSockets 是一个基于 .NET/C# 实现的开源 WebSocket 网络库,其完整实现了 RFC 6455 (The WebSocket Protocol) 协议标准,并部分实现了 RFC 7692 (Compression Extensions for WebSocket) 协议标准。Cowboy.WebSockets 中对于 WebSocket 的 Client/Server 分别做了实现。Cowboy.WebSockets 的内部实现是基于 Cowboy.Sockets 中的 TAP 模式的 AsyncTcpSocketServer 和 AsyncTcpSocketClient 。关于 Cowboy.Sockets 可以参考文章《C#高性能TCP服务的多种实现方式》。阅读全文
posted @ 2016-02-06 06:31 匠心十年 阅读(3065) 评论(35) 编辑
摘要: 本篇文章的主旨是使用 .NET/C# 实现 TCP 高性能服务的不同方式,包括但不限于如下内容:APM 方式,即 Asynchronous Programming Model;TAP 方式,即 Task-based Asynchronous Pattern;SAEA 方式,即 SocketAsyncEventArgs;RIO 方式,即 Registered I/O。在 .NET/C# 中对于 Socket 的支持均是基于 Windows I/O Completion Ports 完成端口技术的封装,通过不同的 Non-Blocking 封装结构来满足不同的编程需求。以上方式均已在 Cowboy.Sockets 中有完整实现,并且 APM 和 TAP 方式已经在实际项目中应用。Cowboy.Sockets 还在不断的进化和完善中,如有任何问题请及时指正。阅读全文
posted @ 2016-02-05 14:42 匠心十年 阅读(17158) 评论(66) 编辑
摘要: 在各种软件质量模型的描述中,都包含着软件可维护性(Maintainability)这一属性。而越是生命周期长的软件,对其软件可维护性的要求越高。而提高软件可维护性的根本方式就是编写可阅读的代码,让其他人理解代码的时间最小化。代码生来就是为人阅读的,只是顺便在机器上执行以完成功能。在漫长的软件生命周期中,我们有很多机会去修改软件代码,比如发现了新的 Bug、增加新的功能、改进已有功能等。修改代码的第一步当然就是阅读代码,以了解当前的设计和思路。如果代码都读不懂的话,何谈修改呢?还有,大概率条件下,修复自己实现模块的 Bug 的人通常就是你自己,如果时隔几个月后自己都读不懂自己编写的代码,会是什么感受呢?所以,如何编写出易读的代码就成了问题的关键。而能否编写出易读代码,则直接取决于软件工程师自己的的编程风格和代码品味。阅读全文
posted @ 2015-05-04 16:22 匠心十年 阅读(21308) 评论(100) 编辑
摘要: K-Means 是一种基于距离的排他的聚类划分方法。K-Means 基本原理:给定划分数量 k。创建一个初始划分,从数据集中随机地选择 k 个对象,每个对象初始地代表了一个簇中心(Cluster Centroid)。对于其他对象,计算其与各个簇中心的距离,将它们划入距离最近的簇。采用迭代的重定位技术,尝试通过对象在划分间移动来改进划分。所谓重定位技术,就是当有新的对象加入簇或者已有对象离开簇的时候,重新计算簇的平均值,然后对对象进行重新分配。这个过程不断重复,直到各簇中对象不再变化为止。K-Means 算法最常见的实现方式是使用迭代式精化启发法的 Lloyd's algorithm。阅读全文
posted @ 2015-02-09 23:06 匠心十年 阅读(1850) 评论(1) 编辑
摘要: 流网络(Flow Networks)指的是一个有向图 G= (V, E),其中每条边 (u, v) ∈ E 均有一非负容量 c(u, v) ≥ 0。如果 (u, v) ∉ E 则可以规定 c(u, v) = 0。流网络中有两个特殊的顶点:源点 s (source)和汇点 t(sink)。为方便起见,假定每个顶点均处于从源点到汇点的某条路径上,就是说,对每个顶点 v ∈ E,存在一条路径 s --> v --> t。因此,图 G 为连通图,且 |E| ≥ |V| - 1。阅读全文
posted @ 2015-02-06 03:32 匠心十年 阅读(4808) 评论(5) 编辑
摘要: 对于全源最短路径问题(All-Pairs Shortest Paths Problem),可以认为是单源最短路径问题的推广,即分别以每个顶点作为源顶点并求其至其它顶点的最短距离。Johnson 算法描述如下:给定图 G = (V, E),增加一个新的顶点 s,使 s 指向图 G 中的所有顶点都建立连接,设新的图为 G’;对图 G’ 中顶点 s 使用 Bellman-Ford 算法计算单源最短路径,得到结果 h[] = {h[0], h[1], .. h[V-1]};对原图 G 中的所有边进行 "re-weight",即对于每个边 (u, v),其新的权值为 w(u, v) + (h[u] - h[v]);移除新增的顶点 s,对每个顶点运行 Dijkstra 算法求得最短路径;Johnson 算法的运行时间为 O(V2logV + VE)。阅读全文
posted @ 2015-02-02 08:33 匠心十年 阅读(1702) 评论(1) 编辑
摘要: Floyd-Warshall 算法采用动态规划方案来解决在一个有向图 G = (V, E) 上每对顶点间的最短路径问题,其中图 G 允许存在权值为负的边,但不存在权值为负的回路。Floyd-Warshall 算法的运行时间为 Θ(V^3)。Floyd-Warshall 算法的设计基于了如下观察。设带权图 G = (V, E) 中的所有顶点 V = {1, 2, . . . , n},考虑一个顶点子集 {1, 2, . . . , k}。对于任意对顶点 i, j,考虑从顶点 i 到 j 的所有路径的中间顶点都来自该子集 {1, 2, . . . , k},设 p 是该子集中的最短路径。Floyd-Warshall 算法描述了 p 与 i, j 间最短路径及中间顶点集合 {1, 2, . . . , k - 1} 的关系,该关系依赖于 k 是否是路径 p 上的一个中间顶点。阅读全文
posted @ 2015-02-02 08:32 匠心十年 阅读(1765) 评论(5) 编辑
摘要: Dijkstra 算法又称为单源最短路径算法,由计算机科学家 Edsger Dijkstra 于 1956 年构思并于 1959 年发表。其解决的问题是:给定图 G 和源顶点 v,找到从 v 至图中所有顶点的最短路径。Dijkstra 算法的初始实现版本并未使用最小优先队列实现,其时间复杂度为 O(V^2)。Leyzorek et al 在 1957 提供了基于 Fibonacci heap 的最小优先队列实现版本,其时间复杂度为 O(VlogV)。阅读全文
posted @ 2015-02-02 08:30 匠心十年 阅读(1555) 评论(0) 编辑
摘要: Bellman-Ford 算法是一种用于计算带权有向图中单源最短路径的算法。该算法由 Richard Bellman 和 Lester Ford 分别发表于 1958 年和 1956 年。Bellman-Ford 算法和 Dijkstra 算法同为解决单源最短路径的算法。对于带权有向图 G = (V, E),Dijkstra 算法要求图 G 中边的权值均为非负,而 Bellman-Ford 算法能适应一般的情况(即存在负权边的情况)。Bellman-Ford 算法的时间复杂度为 O(V*E),其中 V 为顶点数量,E 为边的数量。阅读全文
posted @ 2015-02-02 08:29 匠心十年 阅读(3370) 评论(3) 编辑