Q&A-Ray-20180710
Q:
如果集群多个客户端订阅会不会重复接收消息?
A:
集群环境用,有另外一个参数。
NodeManager类没有在框架里面:
public interface INodeManager : IGrainWithStringKey
{
/// <summary>
/// 初始化节点管理器
/// </summary>
/// <param name="nodeList"></param>
/// <returns></returns>
Task Init(List<string> nodeList);
/// <summary>
/// 获取一个节点名称作为当前节点的名称
/// </summary>
/// <returns></returns>
Task<string> GetNodeName();
/// <summary>
/// 保持节点活动状态(超时节点会被回收)
/// </summary>
/// <param name="nodeName"></param>
/// <returns>是否续活成功</returns>
Task<bool> KeepLive(string nodeName);
}
public class NodeManager : Orleans.Grain, INodeManager
{
List<string> nodeList;
Dictionary<string, DateTime> nodeUserDict = new Dictionary<string, DateTime>();
public Task Init(List<string> nodeList)
{
this.nodeList = nodeList;
return Task.CompletedTask;
}
public Task<string> GetNodeName()
{
foreach (var node in nodeList)
{
if (nodeUserDict.TryGetValue(node, out var liveTime))
{
if (DateTime.UtcNow.Subtract(liveTime).TotalSeconds <= 35)
continue;
else
{
nodeUserDict[node] = DateTime.UtcNow;
}
}
if (!nodeUserDict.ContainsKey(node))
{
nodeUserDict.Add(node, DateTime.UtcNow);
}
return Task.FromResult(node);
}
return Task.FromResult(string.Empty);
}
public Task<bool> KeepLive(string nodeName)
{
if (nodeUserDict.ContainsKey(nodeName))
{
if (nodeList.Contains(nodeName))
{
nodeUserDict[nodeName] = DateTime.UtcNow;
return Task.FromResult(true);
}
else
nodeUserDict.Remove(nodeName);
}
return Task.FromResult(false);
}
}
Q:
没太搞明白这个怎么用,也就是集群客户端订阅会重复消费吗?
A:
这个类似分布式锁,设置只能启动三个节点,每次启动先去获取一个NodeName,如果获取得到就能启动,获取不到重试几次还不行就直接报错
Q:
就是在订阅的时候,限制启动节点。
示例:
var socketNodeManager=GrainClient.GrainFactory.GetGrain<INodeManager>("coin_websocket");
var nodeList=new List<string>(){ "Coin","Coin1","Coin2"};
socketNodeManager.Init(nodeList).GetAwaiter().GetResult();
while(true)
{
var nodeName=socketNodeManager.GetNodeName().GetAwaiter().GetResult();
if(!string.IsNullOrEmpty(nodeName))
{
Task.Factory.StartNew(async ()=>{
while(true)
{
await Task.Delay(TimeSpan.FromSeconds(30));
if (!await socketNodeManager.KeepLive(nodeName))
{
await socketNodeManager.Init(nodeList);
}
}
});
SubscribeManage.Start(nodeName).GetAwaiter().GetResult();
//或:SubscribeManage.Start(nodeName, nodeList).GetAwaiter().GetResult();
break;
}else
{
Task.Delay(20).Wait();
}
}
Q&A-Ray-20180710的更多相关文章
- IGS_学习笔记03_Integrated SOA Gateway设定配置(案例)
20150506 Created By BaoXinjian
- OpenCascade Ray Tracing Rendering
OpenCascade Ray Tracing Rendering eryar@163.com 摘要Abstract:OpenCascade6.7.0中引入了光线跟踪算法的实现.使用光线跟踪算法可实现 ...
- three.js 来源目光(十三)Math/Ray.js
商域无疆 (http://blog.csdn.net/omni360/) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:商域无疆 - 本博客专注于 敏捷开发 ...
- Ray Tracing
Ray Tracing 题目链接:http://codeforces.com/problemset/problem/724/C 拓展欧几里得 //为什么这次C题这么难啊=.= 可以观察到,光线在矩形中 ...
- 【LA3938】"Ray, Pass me the dishes!"
原题链接 Description After doing Ray a great favor to collect sticks for Ray, Poor Neal becomes very hun ...
- 【RAY TRACING THE REST OF YOUR LIFE 超详解】 光线追踪 3-6 直接光源采样
Chapter7 Sample Lights Directly Preface 今天我们来讲这个还算牛逼的技术——直接光源采样 之前我们提到过,在2-7 前两篇我们也提到要减少噪点,就是图片上的黑点 ...
- codeforces 724c Ray Tracing
好题 原题: There are k sensors located in the rectangular room of size n × m meters. The i-th sensor is ...
- 射线和三角形的相交检测(ray triangle intersection test)【转】
本文以Fast, Minimum Storage Ray Triangle Intersection为参考,在此感谢原作者,大家也可以直接阅读原版. 概述 射线和三角形的相交检测是游戏程序设计中一个常 ...
- Efficient GPU Screen-Space Ray Tracing
http://jcgt.org/published/0003/04/04/paper.pdf 一个号称只有2ms的实时gpu光线追踪 screen space reflection用到了 和其他ray ...
- games101 - 4 - Ray Tracing
games101 - 4 - Ray Tracing 目录 games101 - 4 - Ray Tracing 为什么需要Ray Tracing Recursive (Whitted-Style) ...
随机推荐
- OC笔记一:Objective
1.OC简介 全称:Objective-C,是扩充C的面向对象编程语言,主要用于iOS和Mac OS开发. C语言的基础上,增加了一层最小的面向对象语法 完全兼容C语言 可以在OC代码中混入C语言代码 ...
- HTML5离线缓存攻击测试(二)
经过昨天的测试,发现使用离线缓存的网站会被攻击.但是,不使用离线缓存的网站就真的不会受到这样的攻击么? 据我理解,按照标准当浏览器请求manifest文件时,若没有请求到,或者文件发生改变,应当不使用 ...
- python chrome selenium
#coding=utf-8 from selenium import webdriver options = webdriver.ChromeOptions() options.add_argumen ...
- GIS基础软件及操作(一)
原文 GIS基础软件及操作(一) 练习一.浏览地理数据 使用 ArcGIS浏览地理数据 第1步 启动 ArcMap 启动ArcMap.执行菜单命令:开始>>所有程序>> Ar ...
- 微信小程序把玩(二十一)switch组件
原文:微信小程序把玩(二十一)switch组件 switch开关组件使用主要属性: wxml <!--switch类型开关--> <view>switch类型开关</vi ...
- Android零基础入门第77节:Activity任务栈和启动模式
通过前面的学习,Activity的基本使用都已掌握,接下来一起来学习更高级的一些内容. Android采用任务栈(Task)的方式来管理Activity的实例.当启动一个应用时,Android就会为之 ...
- KM算法 详解+模板
先说KM算法求二分图的最佳匹配思想,再详讲KM的实现.[KM算法求二分图的最佳匹配思想] 对于具有二部划分( V1, V2 )的加权完全二分图,其中 V1= { x1, x2, x3, ... , x ...
- python中的函数名,闭包,迭代器
一.函数名 函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数的变量,单纯print()出的是一个内存地址. def func(): print('你说你有点难追') print(func ...
- TCP使用注意事项总结
目录 发送或者接受数据过程中对端可能发生的情况汇总 本端TCP发送数据时对端进程已经崩溃 本端TCP发送数据时对端主机已经崩溃 本端TCP发送数据时对端主机已经关机 某个连接长时间没有数据流动 TCP ...
- 08 Javascript的函数
函数:就是将一些语句进行封装,然后通过调用的形式,执行这些语句. 函数的作用: 将大量重复的语句写在函数里,以后需要这些语句的时候,可以直接调用函数,避免重复劳动. 简化编程,让编程模块化. cons ...