本人学C#.net的,最近在找工作时,遇到几个有些难度的面试问题,看有没有高手能够解答:
1.有两台电脑A和B,A中放Web应用程序,B中放数据库,原来A可以直接访问B中数据库,但是由于
安全原因,现在不允许A直接访问B了,A需要通过另外一台电脑C来访问B中数据库,请问如何实现
?(注意:C中无IIS,也没有数据库软件,也不能存储,近乎裸机)
2.通过某个网址URL可以访问到服务器A,如果服务器A停电了,如何让这个URL自动连接到备用服
务器B ?
3.有3个桶都没有刻度,A桶容量13L,装有10L水,B桶7L装有3L水, C桶6L装有2L水,如何使3个桶
各装5L水?求算法或C#代码
谢谢各位,补充一下,第2题中,是应用程序服务器停电,而不是数据库服务器停电,如果只是数据库断线应该比较好处理,而且同样的URL网址要自动连接到一台应用服务器上,注意是自动不是手动去修改。
第3题中,确实不能刻刻度,也不能用肉眼去比较,不能用一个5L的高度去比较另一个5L,因为并没有说桶的底面积是一样的,也许是不规则的桶呢,所以只能计算
1、三层架构。在C服务器上写一个服务,Windows服务(基于Socket访问)或WCF服务或WEBSERVICE服务都可以。
2、使用热备功能实现(假如你希望A能用的时候不访问B,数据库的安全一般就使用热备)或者使用负载均衡(两台服务器会同时负担访问请求)
3、
A->B:A(6)、B(7)
A->C:A(2)、C(6)
(先去做饭,再想想)
简单的想了下,3个桶。。。这样的容量,有点困难。头痛,先不想了。
第一问题,由于C中没有IIS也没有数据库,所以WCF服务或WEBSERVICE服务都不行,这两个方法我当时就提出但是被面试官否定了,Windows服务(基于Socket访问)具体怎么实现?能让A通过C来访问B中数据库吗?愿闻其详,谢谢!
@cjk:
1、C中没IIS不等于不能运行WCF。不过,WCF一般的运行是需要IIS。
2、SOCKET通信,这个就需要你去深入了解了,说白了,就是在服务器写一个端口监听程序,有监听就启动一个线程执行请求并返回结果,IIS服务本身就是一个SOCKET通信程序
3、还可以使用REMOTE技术,REMOTE技术是不需要IIS服务支撑的。
@cjk: 还有一个可考虑的方案就是使用端口转发,让C只是一个端口代理服务器,所有的请求发送到C,而C却什么都不做,只是左手右手的把问题交给B来实现。
端口转发软件市面不少,可以搜索下,PORTTUNNEL是其中的一个。
2.如果AB在一起,可以用负载平衡,如果不在一起,可以通过更新DNS的A记录让URL转向到B服务器.
第一题 我想到了 3层架构
第二题 利用服务器连接超时情况
第三题 假设有一个容量为5L的桶D 然后你懂得。。。
关于第三题:
如果桶是不透明的话,正常来说应该是无解.推理如下:
假设最后能做到三个都是5L,那么它的前一步必须是有一个是5L,一个大于5L,一个小于5L.它的步骤必然是从大于5L倒到小于5L的桶里.可是从题目中,由于没有多余的水,同时桶的大小都是大于5L的,这时候就不能做到这一点.
举个例子:
最后要从A倒到B中.B<5L,可以是4,3,2,1,0.对应的A是6,7,8,9,10.这时候无论怎么倒都不能倒出2个5L.
反过来如果要从B倒到A中,B>5L,可以是6,7,A可以是4,3,这也倒不出2个5L.
对于AC组合和BC组合也是一样,所以我推论是没办法做到的.
换一种思路的话,如果这个桶是透明的话,可以做到.一开始就可以将B倒到C中得到5L,然后按照这个5L的高度将A倒到B中(或者使得AB平均).
用了宽搜的方法搜了所有的情况,的确是搜不出5,5,5,先买个面吃,等会回来贴代码.
@davp_p:
宽搜算法:
以三个桶的水量为状态,初始状态即为(10,3,2),最多会有13*7*6种状态,用一个3维数组把这些状态存起来.
由于只有三个桶,在一次倒水的时候只有6种可能:A->B,A->C,B->A,B->C,C->A,C->B,如果是能倒出结果,那么在这一步的倒水方法里面必然在这6种可能里面.
建一个队列,头即为(10,3,2),在队列上加上它可能到达的可能(最多6个),移出头到下一个点,再加上它到达的可能,这样一直加下去直到有(5,5,5)或者把所有可能都取完(队列为空).加结点的前先看3维数组中是否已经有该状态.如果队列为空则无解.
代码我是用java写的,不知道要不要.
1、有很多种方法,让A访问B时,强制经过C路由,或者在C上安装代理,让A通过C的代理访问B。
2、反向代理。不光可以用于处理服务器故障热切换,还可以负载均衡。
3、将C中的2L,倒入B,这样B中就有5L水,记下这个时候B桶中装有5L水的位置,标上刻度。
将B中的水全部倒回C。此时C中有5L水,将A口的水倒往B。以之前标上的刻度为准。此是B中5L,A中剩余5L。
这个方案倒是可行!
不过。。。或许考官的目的就是要得到这样的答案。有时程序员写程序的时候总是陷入理想化(嘿嘿,我就是),钻入了死点。
如果一定要用三个桶倒来倒去,那么。。。我还没想出来怎么不做标记的情况下能倒出3个5。
题目可能只是让我们换个角度、换个思路来解决问题,必要的时候借助外力!
第1个问题,让A通过C的代理访问B,听起来好像是不错的,但是具体如何实现呢?我知道局域网可以通过代理服务器访问Internet,但是现在是A是要访问B的数据库,不是访问某个网址,而且C中也没有IIS,比如我们现在要指定A中数据库连接字符串,connectionString="Data Source=192.168.1.x\sql2005,这里用C
的IP地址肯定是不行的,用B的ip也不行,应为B中根本没有数据库,该如何实现代理呢?
@cjk: 所谓代理,其实你可以理解为路由一样,本身是没有任何应用层服务的,它只是负责转发而已。
就像网络上所有的交换机和路由器,它们没有提供IIS,没有FTP,没有游戏服务,而我们都是直接与这些网关、路由器通讯的。
代理的原理其实跟路由是差不多的,就是看起来就像是C上面的数据库一样,其实C是没有的。C只是把所有的通讯都转发给了B而已,然后B再回复给A。这样C就充当起了完全的“中间人”。中间人是没有任何有效的功能的,它的功能只是转发。
第三题:先将B中的全部倒入C中,C就满了5L ,再将A中的水到一半到B中就行了 。
我觉得倒水的问题,应该不准刻刻度!
算不出来,三个瓶子各5L水,必须同时成立,不管假设三个瓶子中的哪一个有5L水,另外2个都对不出来5L。实在想不出来