【问题标题】:Minimize service requests最小化服务请求
【发布时间】:2019-06-11 21:19:29
【问题描述】:

我有一个 WCF 服务,我可以使用合同方法从一个点到另一个点(纬度和经度)以米为单位获得距离:

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

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

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

【问题讨论】:

  • 您是否使用 WCF 服务来获取 2 个长/纬点之间的点对点距离?如果你是,那么你可以自己计算。
  • 我没写,但我需要一个不涉及在客户端实现方法的答案
  • 这是一个有问题的约束。现有的任何语言都可以进行这种计算。缓存无济于事,因为请求不会重复太多。请求的可能组合太多了。我看不到任何涉及客户端调用远程应用程序以解决数学问题的好的解决方案。它所做的只是形成请求、发送、等待和解析结果的工作比数学本身复杂得多。我会对你为什么不能在客户端上做这件事感兴趣,因为即使看起来你做不到,也可能有办法。

标签: c# algorithm wcf


【解决方案1】:

此方法只是一个数学函数,因此无需将其托管在 WCF 服务中。调用此服务的任何内容都应该有自己的本地版本的此方法。这将通过消除服务请求来最小化服务请求,并且速度会快得惊人。

从其他详细信息来看,您似乎也在执行一个返回多个点的查询,并且您希望在这些点中找到最接近给定位置的五个点。

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

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

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

Points[] GetPointsUsingSomeQuery(queryInput)

...如果queryInput 一遍又一遍地重复。

但是如果你把它改成这个……

Points[] GetPointsClosestToSomeLocation(queryInput, Point location)

...如果location 不经常重复,那么缓存的任何好处都会消失。你只是缓存了一堆数据并且永远不会使用它,因为你永远不会两次发出完全相同的请求。

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

最好的办法是克服任何限制,即您不能在本地执行此数学函数。

【讨论】:

  • 我没写,但我需要一个不涉及在客户端实现方法的答案
【解决方案2】:

如果您正在尝试查找 2 个长/纬点之间的点对点距离或飞行距离,那么您可以查看以下答案:

SO Answer

如果您是通过公路检查距离,那么您唯一的选择是缓存这些点之间的结果(如果经常调用)。请注意缓存,您的提供商可能会禁止此操作并最好检查他们的 T&C。

【讨论】:

    【解决方案3】:

    最后的答案是把(Longitude, Latitude)当作(x,y)坐标,用公式计算从起点到当前(x,y)的直线长度:

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

    我们首先读取 5 个点,计算长度并保持最大距离和点到最大距离(使用堆栈或列表以保持多个距离和点)。在我们读取的每个点上,我们只是计算距离并更新距离和点,如果新的距离更小

    【讨论】:

      猜你喜欢
      • 2022-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-22
      • 2013-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多