【问题标题】:Where to run complex algorithms? Server side or Client side? [closed]在哪里运行复杂的算法?服务器端还是客户端? [关闭]
【发布时间】:2017-05-17 07:57:22
【问题描述】:

我正在尝试开发一个包含大量用户数据库的社交网络 android 应用程序。我对 Android 应用程序开发非常陌生,并试图了解应用程序开发背后的概念。 我正在使用以下技术:

1) MYSQL + PHP(RESTful Web 服务) 2) Android Studio (Java)

在应用程序中,我必须运行一些复杂的算法来对从存储在云服务器中的数据库的不同表中收集数据的用户进行排名。

我的问题是“在哪里运行这个算法?”。 我是否应该在 PHP 中编写代码以使算法在服务器端运行,然后将此数据发送到客户端 (要么) 我应该使用从服务器收集的数据在 JAVA (Android Studio) 中编写代码吗?

我的应用在这两种情况下的性能有何不同?

编辑:感谢您的所有回复。

我对异步任务和多线程有想法。

我产生了这个疑问,因为排名对我的所有用户来说都很常见,这是有区别的。如果我将 raking 算法放在服务器端,即使所有用户的结果都相同,但相同的算法必须运行多次(例如,如果有 10000 个用户,相同的算法在服务器端运行 10000 次)。但如果我确实放在客户端,我可能会超过这个。但需要专家的解决方案。

【问题讨论】:

  • 由于您的算法很复杂,最好在服务器上运行并将结果传递给客户端,因为它会使应用程序更具响应性
  • 取决于您的资源、预算和货币化。如果您的客户为完成该算法而付费,您可以提供服务器端解决方案,否则您将不得不在您的移动设备上进行。它还取决于它将在移动设备上运行多快?如果它花费的时间少于 100 毫秒,那么您不应该关心,如果这是用户明确愿意等待的事情,它甚至可能需要长达 8-10 秒。
  • 如果您的算法是一个需要花费大量时间和金钱开发的商业机密,那么它也不应该在应用程序中运行或存储,因为它可能会被逆向工程。

标签: java php android mysql performance


【解决方案1】:

这个问题可能有点基于意见,但我认为有一些设计规则可以用作指导:

  • 当计算需要大量数据时,请尽可能靠近数据。这通常在数据库本身上。传输大量数据是资源密集型的,通过慢速链接(例如在服务器和客户端之间)不是一个好主意。
  • 如果计算需要处理私有数据,还设置了数据可以传输多远用于计算目的的界限。不在客户端显示数据不是对隐私数据的保护!
  • 当计算是资源密集型时,可以缓存,对许多用户有效,甚至可以提前计算,在服务器上执行并缓存结果。
  • 如果计算需要少量数据但计算量很大,请问问自己服务器是否可以很好地扩展以支持所有客户端发出并发请求。尽管客户端的资源有限(现在仍然相当可用!),但让客户端计算此类操作可以带来更稳定的整体性能。

【讨论】:

  • @ChaitanyaChikkala 您的编辑表明您的计算属于第 1、2 和 3 点。所以计算数据库上的排名并缓存结果。
  • 感谢@Lucero,感谢您的设计指南。对我很有用。
  • 另外,在服务器端进行计算会导致客户端松散耦合,因此将来您可能会选择拥有一个 iOS/Windows 应用程序,并且您不需要在那里复制计算逻辑。跨度>
【解决方案2】:

始终建议在服务器端运行算法,因为将您的业务逻辑放在客户端应用程序中会对应用程序的安全性造成威胁。另一方面,由于长时间运行的任务,它会降低应用程序的性能,对于良好的用户体验来说是不可接受的,如果稍后你为多个平台创建,例如 web、iOS 等,你必须再次编写相同的逻辑完全浪费对吗?将算法放入服务器端并调用使用 Rest API。

【讨论】:

  • 感谢您的回复。我已经编辑了这个问题。请阅读和建议。
【解决方案3】:

这真的取决于你所说的复杂是什么意思。

如果复杂意味着大量的数学和计算等,而不是大量的数据。

我可能会在客户端上执行此操作。将需要大量计算的流程转移给您的客户可以大大提高您的整体响应能力。您正在有效地将客户端用作计算引擎,这通常是一件好事。

如果复杂意味着需要分析大量数据而几乎不涉及实际数学。

您应该将大量数据移动的距离保持在最低限度。尽可能靠近您的数据库服务器处理它。如果可以的话,把其中的一部分放到数据库中。

【讨论】:

  • 感谢您的回答。复杂意味着使用 2-3 种排序算法处理大量数据,并且不涉及太多数学但涉及如此多的循环。无论如何,我已经编辑了这个问题。请阅读和建议。
【解决方案4】:

在服务器上运行算法以获得最佳结果,否则会降低应用程序的性能。

在应用程序上运行长时间计算时,应用程序会冻结并最终崩溃。

【讨论】:

  • 听说过异步任务吗?
  • 他是 android 新手 .. 我认为他甚至没有考虑过多线程 .. 或使用异步计算。
  • @juergend 虽然 AsyncTask 为您提供了一种在后台(而不是在主线程上)执行操作的方法,但 Android 应用程序不应该使用大量数据执行复杂的算法。别忘了移动端的资源真的很有限!
  • @TodorKostov:在服务器上对数千个应用用户进行大量计算没有问题?
  • 作为问题 - 答案是基于意见的。我个人不喜欢那些无缘无故需要一直在线的应用。
【解决方案5】:

我们也在使用 Java Springs 开发类似的网络应用程序。要根据性能指标对用户进行排名,您已在后端 (php) 上运行它,因为它会影响您的应用程序性能。也就是说,如果您知道您已经定期运行这些算法(例如每月/每周/每天),那么最好分配一个 cron 作业来执行操作并存储结果而不必干扰您的应用程序。

【讨论】:

  • 感谢您的回答@barak_332
【解决方案6】:

根据您的情况,在服务器端运行它,然后您无需将所有日期传输给您的客户端,而是将样本结果。这不仅减少了带宽,也提高了用户的感受。在服务器端,在后台运行它,使请求可以在很短的时间内响应。计算完成后,刷新客户端状态。你也可以使用队列来存储计算任务,每次计算几次。

【讨论】:

  • @ChaitanyaChikkala 虽然它的 1000 次,但不是同时。如果同时计算的数量太多,则将 then 放入一个队列中,每次计算一些,例如 5 个。
  • 感谢您的建议@kris-roofe
猜你喜欢
  • 1970-01-01
  • 2013-08-10
  • 2014-05-10
  • 1970-01-01
  • 1970-01-01
  • 2016-08-22
  • 1970-01-01
  • 1970-01-01
  • 2018-06-06
相关资源
最近更新 更多