最小化服务请求

时间:2019-05-20 12:23:34

标签: c# algorithm wcf

我得到了WCF服务,通过合同方法,我可以从该点获得以米为单位的距离(纬度和经度):

public double GetDistance(double originLat, double originLng, double destLat, double destLng)

其中一个点是一个常数点,另一个点是我需要根据我收到的其他一些信息从数据库中提取的几个位置之一。最终目标是使5个最接近该恒定点的位置。

想象一下,如果使用WCF服务每次请求要花钱。.使用最直接的方法,我需要从数据库中获取所有位置,然后需要针对每个位置从服务中发出请求。某种方式使其变得更好的方式,例如以某种方式过滤数据库中的位置以减少对服务的请求?

3 个答案:

答案 0 :(得分:1)

此方法只是一个数学函数,因此不需要将其托管在WCF服务中。无论调用此服务是什么,都应该仅具有此方法的自己的本地版本。这样可以消除服务请求,从而最大程度地减少服务请求,而且速度会更快。

从其他细节来看,听起来您还正在执行返回多个点的查询,并且要从这些点中查找最接近给定位置的五个点。

仅当您以一定频率发出相同的请求时,缓存才有帮助。可能会重复第一个返回点集合的查询,因此为给定查询缓存点集合可能有意义。

但是除非您要与这些点进行比较的位置也经常重复,否则添加它会使您的缓存混乱。

例如,此可能受益于缓存...

Points[] GetPointsUsingSomeQuery(queryInput)

...如果queryInput一遍又一遍。

但是如果您将其更改为此...

Points[] GetPointsClosestToSomeLocation(queryInput, Point location)

......然后,如果不经常重复使用location,则缓存的任何好处都将消失。您只会缓存一堆数据,而永远不会使用它,因为您不会两次发出完全相同的请求。

这也是为什么缓存可能对原始功能没有帮助的原因。除非您要一遍又一遍地重复精确的组合,否则您永远不会在缓存中找到所需的结果。即使偶尔重复,也可能不值得。您仍然会提出很多请求,并且还会在缓存中存储大量未使用的数据。

您最好的选择是克服所有不能在本地执行此数学函数的约束。

答案 1 :(得分:0)

如果您要查找2个长点/点之间的点对点距离或飞行距离,则可以查看以下答案:

SO Answer

如果您要按路检查距离,则唯一的选择是如果经常调用,则将结果缓存在这些点之间。提防缓存,您的提供商可能会禁止这样做,最好检查他们的条款和条件。

答案 2 :(得分:0)

最后,答案是将(经度,纬度)视为(x,y)坐标,并使用公式计算从起点到当前(x,y)的线的长度:

d = sqrt((x1-x2)^ 2 +(y1-y2)^ 2)

我们首先读取5个点,计算长度并保持最大距离并将该点保持为最大距离(使用堆栈或列表以保持多个距离和点)。在我们阅读的每个点上,我们只需计算距离并更新距离并在新距离较小的情况下指向该点