我们的团队希望设计一个基于网络的零售药店管理系统。基于web的解决方案很好,因为不需要用户安装。
从中央数据库获取的一些数据是只读的,并在客户端(5000家药房用户)之间共享,客户端可能将他们的账单或其他任何东西存储到中央数据库中。
有一个挑战。网络应用程序应该有100%的启动时间。
发布于 2018-04-29 19:58:25
如果网络连接丢失了,不是你的应用程序坏了,而是互联网连接。所以你需要关注的是网络连接。如果始终连接到互联网是至关重要的,那么在每个位置都有两个internet连接(冗余)就可以很容易地做到这一点。(应来自不同的经营者)
在许多情况下,药房也需要一个互联网连接才能处理信用卡购买,所以即使你的应用程序也是一个“本地安装的桌面应用程序”--如果没有互联网连接,他们可能无法使用它做很多事情。
发布于 2018-04-28 14:07:39
您可能想要考虑渐进的Web:https://developers.google.com/web/progressive-web-apps/
https://en.wikipedia.org/wiki/Progressive_网站_应用程序
https://scotch.io/tutorials/the-ultimate-guide-to-progressive-web-applications
无论是对我原来答案的评论,还是从其他所有答案的角度来看,我都认为这个问题是否有一个可信、现实的答案,还是首先应该被否决的问题?
显然,问这个问题的团队有很强的开发桌面应用程序的背景,这些应用程序会安装在客户端的计算机上,并与本地数据脱机工作。我们都知道,随着网络的出现,事情发生了巨大的变化。
另一方面,我们也知道多年来网络被滥用以适应在可用性和功能性方面远远超出其本质的需求的扩展。有许多尝试迫使web应用程序模仿桌面应用程序。说到底,正是我们开发人员努力通过各种复杂的技巧、黑客和专有解决方案来维持收支平衡。所有这些都导致了不可维护的、不稳定的软件,而忽略了web标准。
很多时候,问题的根源是糟糕的设计,这是因为缺乏对设计师的意识转变。我相信我们都同意,一个人既不能设计一个成功的应用程序,也不能建立一个成功的应用程序与桌面应用的心态。
话虽如此,我对设计团队的诚实回答将是放弃“挑战”,在他们的脑海中重新设计网络。我确实相信,所谓的“挑战”最终将证明根本不是一个挑战,因为这是他们的桌面背景强加在他们身上的东西。
发布于 2018-04-29 07:41:31
从所提供的信息来看,很难给出正确的答案。所以我只能提供一些想法:
这个web应用程序应该有100%的启动时间。
这是很难实现的。即使在一台机器的本地场景中。
你必须与停电、硬件故障等作斗争。一旦涉及到网络,你就会有更多的故障部件,更不用说互联网和片状连接了。
加一些数字:
取自谷歌SRE图书
因此,即使您能够保证99.99%的可用性,问题是,客户使用的网络是否可用。
为了减少网络问题,您需要为每个客户提供某种冗余的网络访问。
基于web的解决方案很好,因为不需要用户安装。
这是真的,但代价是难以(呃)实现可用性。
从中央数据库获取的一些数据是只读的,并在客户端之间共享。
假设你做了一个前提安装:
A有最新版本的数据库,而Customer B没有更新,因为她/他还在更新?因此,即使您使用一些“智能更新”的前提策略,也应该考虑一致性问题。
客户端可能将他们的账单或其他任何东西存储到中央数据库中。
这是另一个有趣的话题。即使您管理读取部分的前提是安装您的数据,网络问题的写仍然一样:不可靠的连接。
其他人可以访问写入的标准是什么?
只要客户本身不需要“立即”访问,就可以推迟更新部分。
当Internet连接丢失时,我们如何处理在线和离线混合模式?
关于“阅读部分”:
在前提下安装数据库。这是排除网络问题的唯一机会。更新将是单向和简单的:一旦网络可用,更新将被推送。问题:最终的一致性。
关于“写部分”:当网络可用时,可以排队并交付写操作。当没有其他客户依赖时,你就没有问题了。但是,当其他人依赖公布的数据时,您再次遇到了最终一致性的问题。
有什么已知的方法吗?
是也不是。
有几种模式可用,但没有一个大小适合所有的解决方案。为了给出好的建议,必须知道具体的情况,并且您/您的客户愿意接受的权衡。
我们是否应该将数据库的更新同步到本地客户计算机并与之协同工作?
正如上面所写:这似乎是迄今为止最好的解决方案。
我能想到的一个场景是使用平板电脑作为目标平台。这些都是便宜的设备,所以你的客户可以买得起不止一个(买或租)。如果一个设备不能工作,多个设备会增加冗余。设备可以通过WiFi和3/4G冗余连接,以降低网络问题的发生概率。
也许从安全的角度来看,将设备锁定到您的usecase,以防止意外安装的恶意软件访问您的数据,这样做是有意义的。
https://softwareengineering.stackexchange.com/questions/369991
复制相似问题