关于分布式开发的一个问题-数据状态同步

满CD的程序猿 2015-07-20 02:37:58
问题:分布式数据,快速获取某数据的状态。
诸位C友大家好,前些日子做了个有意思的项目;
项目用CS做数据展示C#写的后台ICE做数据传输。
项目需求:将子节点的数据"状态"发送给父节点,还可以这么说,父节点收集子节点的状态数据。
因为篇幅原因这里省去业务需求及其他技术问题往后项目完事了再跟大家分析经验,这里我先说问题。
先上图:

因为数据是分布式的,所以我将节点分了层次关系,即A节点只处理A1、A2俩个节点的数据B只处理B1的数据;
而平台处理A、B俩个节点的数据,这里说明一下数据存在的包含关系,即A节点中只包含了A1、A2的数据B节点只包含B1的数据,平台有下面所有节点的数据。
我的思路:
之前想着如果平台能够知道每个节点的ICE连接地址我用ob设计模式数据推送岂不是很快就搞定了?设计出来后人家说网络可能是跨网段(内网)的,平台可能只能连接A、B节点的网段不能连到A1、A2的网段(哭晕在厕所);
后来我干脆让父节点用多线程的方式每隔多少秒去子节点取一遍数据,即A节点隔5秒去取A1、A2的数据B也一样,然后平台也每隔5s从A、B取一次数据,刚开始数据量不大的时候还好,可是当数据量多了的时候这个状态的反应就会越来越慢,可能节点A1的状态变化很久了平台才抓到。
综合起来有这样几点原因:1:数据量多(万级)ICE传输慢;2:数据接收后需要状态处理我写的算法有问题;3:网络不稳点。
和客户交涉说网络是硬伤(假装安慰下我自己)但客户说会搞定这个问题,所以第三点暂不考虑;第一个问题数据量多的话我在传输数据时对数据进行压缩后再传输出去,这个压缩数据后经测试好了一点点但是因为网络原因有时候数据会丢包不能正常转换!不知道有没有对ICE传输有深入研究过的大神;第二个问题我在处理数据时用多线程的方式每一个节点分一个线程,如果某节点数据特别大的话我在处理状态时还会分线程,当然还是可能存在父节点会取到历史数据的问题(A节点在处理数据时平台正好来取数据,这时因为没有处理完成新的状态数据还在锁定状态所以只能先给历史副本不然会报错,因为是多线程处理想必大家应该都知道)。
经过以上处理数据的状态能达到秒级(10s),但是人家要求必须达到3s最多不能超过5s!(请允许我再哭一个)...
求大神们帮我看看,是不是我的设计思路有问题。
...全文
274 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
满CD的程序猿 2015-07-21
  • 打赏
  • 举报
回复
引用 2 楼 FoxDave 的回复:
平台不是从A和B取结果进行处理吗,那下面的访问不了也没问题啊
版主您好,这里的平台指的是将计算结果综合在一起的后台,当UI发送请求时,这个请求会发送到平台然后由平台将计算分散到每个节点,我这里是将计算方式改为定时去获取子节点的数据(因为每次计算的算法一样),然后将结果综合然后存在平台的内存中,这样UI取数据会很快能呈现结果(省去计算时间),但是这样定时去获取子节点结果的方式还是没有达到要求,处理过程中我用了多线程的方式即一个节点用一个线程(平台计算数据时分俩个线程即A节点一个B节点一个,A节点计算数据时同样这般处理)。也许是我定时去数据计算这种方式不对吗?
满CD的程序猿 2015-07-21
  • 打赏
  • 举报
回复
引用 1 楼 starfd 的回复:
子节点不受你控制吗?为什么你要用定时轮询(pull)的模式,而不是主动推送(push)的模式呢 另外通篇没看出分布式
您好,可能是我表述不够清晰,当UI界面做出一个请求时,平台会将请求分解到不同的节点去计算,然后将数据整合好再传输给UI。我不知道我这样解释算不算对分布式计算的理解。我们知道一般分布式计算的数据量会狠大,需要大量的CPU资源(资源有限),而且客户需要快速的知道结果,所以面对这样的情况(我不知道UI啥时候做请求,但是每次请求计算的算法不变),我将每次计算的结果提前保存在平台服务器的内存中,这样不管UI啥时候获取数据我都将返回内存中计算的结果,UI很快能呈现结果;至于为什么不用push模式是因为当我做一次计算时如果某个节点无法连接时这种推送就中断了,而且网络带宽存在差异如果某节点推送数据太慢我不好做出判断(计算超时,还是其它原因)这样会影响计算的速度,种种原因目前我选择定时轮询去取数据,再将子节点结果整合(即A1计算失败A2计算成功,那么A会综合这俩个结果做为节点A的结果),就这样我的计算结果还是 达不到要求(网络正常情况下),也许您说得主动推送模式值得一试。
  • 打赏
  • 举报
回复
如果轮询,就不要“哭”。只有在笑的时候才敢轮询啊。
  • 打赏
  • 举报
回复
如果因为网络原因导致推送失败,要么提示给用户,要么继续显示上一次的数据给客户(如果允许)
Justin-Liu 2015-07-20
  • 打赏
  • 举报
回复
平台不是从A和B取结果进行处理吗,那下面的访问不了也没问题啊
  • 打赏
  • 举报
回复
子节点不受你控制吗?为什么你要用定时轮询(pull)的模式,而不是主动推送(push)的模式呢 另外通篇没看出分布式

111,125

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧