一路c++服务器的思考题,征集方案
一道c++服务器的思考题,征集方案
10、(思考题)有服务器S1、S2…Sn(100>n>50),每个服务器上维护着连接到该服务器的用户的信息,服务器之间互相连接,当用户信息有更新,必须通知到与它相连的其它服务器。比如S1上的用户a改了昵称,必须通知到S2 、S3…但由于网络的不可靠,更新通知不一定每次都能到达其它服务器,假设S2丢了通知,则S2必须同步上的用户信息,最差情况下,S2~Sn都可能同时丢了S1的通知而导致同步。
每个服务器大概维护10000个用户,用户的信息结构如下,大小平均约100B:(15分)
struct UserInfo
{
int userId; //用户id
string nickname; //昵称
string sign; //签名
//其它用户信息
};
问题:
1) S2如何发现它丢了S1的通知?
2) 每个服务器的带宽限制10M/s,请给出一个可用的同步方案,保证服务器带宽不超过限制的情况下完成同步工作;
3) 显然如果通知越可靠,同步将会大大减少,请提出一些能提高通知可靠性的方案并简单说明它的实现。
------解决方案--------------------
1) S2如何发现它丢了S1的通知?
可否这样:S1 Update后会推送给其他服务器,当S2-Sn服务器收到后反馈给S1一条信息确认收到,如果S1没有收到某太服务器的消息则标记起来。S2-Sn定时发送一条试探性消息给S1,S1收到这些消息后查看是否有个别服务器没有更新到最新状态,返回发送不同的标识码。
本人菜鸟,不知是否正确,同求答案
------解决方案--------------------
可以参考一下CAN总线的信息同步时序。个人觉得那个已经很完善了。
------解决方案--------------------
1. S2如何发现它丢了S1的通知?
S2无法发现它丢了S1的通知。正确的处理方式是:在S1中维护这一张数据表,其中记录的是针对某个用户的变动,未能成功通知到的服务器(假定是S2),S1每隔一定的时间就根据这张表进行重复通知。当通知成功后,就将该记录删除。
2. 每个服务器的带宽限制10M/s,请给出一个可用的同步方案,保证服务器带宽不超过限制的情况下完成同步工作;
楼主给出的架构,正常情况下,不可能实现楼主的这个意图。你这个是典型的几何级数增长。
3. 显然如果通知越可靠,同步将会大大减少,请提出一些能提高通知可靠性的方案并简单说明它的实现。
建议用集中式的数据库服务器,比如每10台服务器共享一个数据库服务器,数据库服务器之间可以通过其自身的机制进行数据复制,这通常只会降低数据库服务器性能的1%左右(用mySql做过这方面的实验验证过),基本可以忽略。其次,如果读写很频繁,可以考虑使用内存数据库(1秒钟,像楼主给出的100Bytes的数据,写20~30W条记录是可以做到的,普通的硬盘版的数据库,能1秒钟写10000条就很不错了)
总体感觉楼主的思路走歪了。
服务器之间交换的信息,应该是数据量很小的控制信息,比如心跳信号。而数据则集中处理。
10、(思考题)有服务器S1、S2…Sn(100>n>50),每个服务器上维护着连接到该服务器的用户的信息,服务器之间互相连接,当用户信息有更新,必须通知到与它相连的其它服务器。比如S1上的用户a改了昵称,必须通知到S2 、S3…但由于网络的不可靠,更新通知不一定每次都能到达其它服务器,假设S2丢了通知,则S2必须同步上的用户信息,最差情况下,S2~Sn都可能同时丢了S1的通知而导致同步。
每个服务器大概维护10000个用户,用户的信息结构如下,大小平均约100B:(15分)
struct UserInfo
{
int userId; //用户id
string nickname; //昵称
string sign; //签名
//其它用户信息
};
问题:
1) S2如何发现它丢了S1的通知?
2) 每个服务器的带宽限制10M/s,请给出一个可用的同步方案,保证服务器带宽不超过限制的情况下完成同步工作;
3) 显然如果通知越可靠,同步将会大大减少,请提出一些能提高通知可靠性的方案并简单说明它的实现。
------解决方案--------------------
1) S2如何发现它丢了S1的通知?
可否这样:S1 Update后会推送给其他服务器,当S2-Sn服务器收到后反馈给S1一条信息确认收到,如果S1没有收到某太服务器的消息则标记起来。S2-Sn定时发送一条试探性消息给S1,S1收到这些消息后查看是否有个别服务器没有更新到最新状态,返回发送不同的标识码。
本人菜鸟,不知是否正确,同求答案
------解决方案--------------------
可以参考一下CAN总线的信息同步时序。个人觉得那个已经很完善了。
------解决方案--------------------
1. S2如何发现它丢了S1的通知?
S2无法发现它丢了S1的通知。正确的处理方式是:在S1中维护这一张数据表,其中记录的是针对某个用户的变动,未能成功通知到的服务器(假定是S2),S1每隔一定的时间就根据这张表进行重复通知。当通知成功后,就将该记录删除。
2. 每个服务器的带宽限制10M/s,请给出一个可用的同步方案,保证服务器带宽不超过限制的情况下完成同步工作;
楼主给出的架构,正常情况下,不可能实现楼主的这个意图。你这个是典型的几何级数增长。
3. 显然如果通知越可靠,同步将会大大减少,请提出一些能提高通知可靠性的方案并简单说明它的实现。
建议用集中式的数据库服务器,比如每10台服务器共享一个数据库服务器,数据库服务器之间可以通过其自身的机制进行数据复制,这通常只会降低数据库服务器性能的1%左右(用mySql做过这方面的实验验证过),基本可以忽略。其次,如果读写很频繁,可以考虑使用内存数据库(1秒钟,像楼主给出的100Bytes的数据,写20~30W条记录是可以做到的,普通的硬盘版的数据库,能1秒钟写10000条就很不错了)
总体感觉楼主的思路走歪了。
服务器之间交换的信息,应该是数据量很小的控制信息,比如心跳信号。而数据则集中处理。