Минимизируйте запросы на обслуживание - PullRequest
0 голосов
/ 20 мая 2019

Я получил услугу WCF, из которой я могу получить расстояние в метрах от одной точки до другой (широта и долгота) с помощью метода контракта:

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

Одна из точек является постоянной точкой,а другой момент - одно из нескольких мест, которые мне нужно извлечь из базы данных в соответствии с другой информацией, которую я получаю.Конечная цель состоит в том, чтобы получить 5 самых близких местоположений к этой постоянной точке.

Представьте себе, если использование службы WCF стоит денег за запрос ... используя самый прямой подход, мне нужно будет получить все местоположения избазы данных, а затем нужно сделать запрос от службы для каждого местоположения. Есть ли способ как-то сделать это лучше, чем каким-то образом фильтровать местоположения в базе данных, чтобы сделать меньше запросов к службе?

Ответы [ 3 ]

1 голос
/ 20 мая 2019

Этот метод является просто математической функцией, поэтому нет необходимости размещать его в службе WCF.Все, что вызывает этот сервис, должно иметь собственную локальную версию этого метода.Это минимизирует запросы на обслуживание, устраняя их, и это будет безумно быстрее.

Из дополнительных подробностей звучит так, как будто вы также выполняете запрос, который возвращает количество точек, и из этих точек вы хотите найти пять, которые находятся ближе всего к заданному местоположению.

Кэширование помогает, только если вы делаете одни и те же запросы с определенной частотой.Вполне возможно, что первый запрос, который возвращает набор точек, может повториться, поэтому может иметь смысл кэшировать набор точек для данного запроса.

Но если только местоположение, которое вы сравниваетек этим пунктам также часто повторяют, добавляя, что это может испортить ваше кэширование.

Например, это может извлечь выгоду из кэширования ...

Points[] GetPointsUsingSomeQuery(queryInput)

...if queryInput повторяется снова и снова.

Но если вы измените его на это ...

Points[] GetPointsClosestToSomeLocation(queryInput, Point location)

... тогда любое преимущество кэширования пропадет, если location не часто повторяется.Вы бы просто кэшировали кучу данных и никогда не использовали бы их, потому что никогда не выполняете один и тот же запрос дважды.

Вот почему кеширование, вероятно, не поможет с вашей исходной функцией.Если вы не собираетесь повторять точные комбинации снова и снова, вы никогда не найдете нужный результат в кеше.Даже если это повторяется время от времени, это, вероятно, того не стоит.Вы по-прежнему выполняете много запросов и также сохраняете много данных, которые вы не используете, в кеше.

Лучше всего преодолеть любое ограничение, которое говорит, что вы не можете выполнить это математическоефункционировать локально.

0 голосов
/ 11 июня 2019

В конце ответом является обработка (Долгота, Широта) как (x, y) координат и вычисление длины линии от начальной точки до текущей (x, y) по формуле:

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

Сначала мы прочитали 5 точек, рассчитав длину и сохранив максимальное расстояние и точку до максимума.расстояние (со стеком или списком, чтобы сохранить несколько расстояний и точек).в каждой точке, которую мы читаем, мы просто вычисляем расстояние и обновляем расстояние и точку, если новое расстояние меньше

0 голосов
/ 20 мая 2019

Если вы пытаетесь найти расстояние от точки к точке или расстояние полета между двумя точками длины / широты, тогда вы можете посмотреть ответ ниже:

SO Ответ

Если вы проверяете расстояние по дороге, тогда ваш единственный вариант - кэшировать результаты между этими точками, если он вызывается часто. Остерегайтесь кеширования, ваш провайдер может запретить это и лучше всего проверить свои T & C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...