Laravel 消费者和提供者应用架构
Posted
技术标签:
【中文标题】Laravel 消费者和提供者应用架构【英文标题】:Laravel Consumer and Provider App architecture 【发布时间】:2015-09-24 12:37:06 【问题描述】:我正在使用 Laravel 构建一个帮助用户找到服务提供商的应用程序。将有 2 个应用程序,例如 Uber,1 个供用户使用,1 个供提供商使用。用户将提出请求,根据请求,选定的提供者将收到通知。就像优步一样。
问题是,我应该如何设计这个。我想到了什么:
2 应用程序: 有 2 个具有公共数据库的 Laravel 应用程序。但是当用户生成请求时,我如何通知提供者呢?只有 DB 发生变化,那么我如何告诉 Provider App User App 生成了请求?
单应用程序 2 前端: 有一个 Laravel 应用程序和 2 个前端。 Play 商店将有单独的应用程序,但只有一个服务器应用程序。我该怎么做?
这种方法有更好的解决方案吗?优步如何做到这一点?
【问题讨论】:
为了帮助其他有类似问题的人,我搬到了 Meteor 而不是 Laravel。在 Meteor 中,我制作了两个完全不同的应用程序并将它们连接到同一个数据库。每当数据库更改时,Meteor 都会将更改反映给两个客户端。它默认使用 websockets,因此所有更改都会推送到客户端。它非常适合我的场景。谢谢 【参考方案1】:由于有单个(数据库),最好使用单个后端应用程序。当用户添加新请求时,您可以将推送通知发送给提供者(android 应用程序)。
【讨论】:
【参考方案2】:您应该开发一个通用 API 和两个应用程序,例如 Uber。或者你可以只为卖家和买家构建一个应用程序,比如 eBay。您应该在服务器代码上使用侦听器,因此每当触发事件时,您都应该发送这样那样的通知。看看侦听器设计模式。
【讨论】:
【参考方案3】:我建议您应该使用给定的服务,例如 PubNub (see Demos)。
这样你可以节省你的服务器开发,还有一个Android-Example 您可以像这样在您的 APP 中简单地使用它:
dependencies
....
compile 'com.pubnub:pubnub:3.7.4'
//'com.pubnub:pubnub-android-debug:3.7.+' For the debug version
和
import com.pubnub.api.*;
import org.json.*;
Pubnub pubnub = new Pubnub("demo", "demo");
try
pubnub.subscribe("my_channel", new Callback()
@Override
public void connectCallback(String channel, Object message)
pubnub.publish("my_channel", "Hello from the PubNub Java SDK", new Callback() );
@Override
public void disconnectCallback(String channel, Object message)
System.out.println("SUBSCRIBE : DISCONNECT on channel:" + channel
+ " : " + message.getClass() + " : "
+ message.toString());
public void reconnectCallback(String channel, Object message)
System.out.println("SUBSCRIBE : RECONNECT on channel:" + channel
+ " : " + message.getClass() + " : "
+ message.toString());
@Override
public void successCallback(String channel, Object message)
System.out.println("SUBSCRIBE : " + channel + " : "
+ message.getClass() + " : " + message.toString());
@Override
public void errorCallback(String channel, PubnubError error)
System.out.println("SUBSCRIBE : ERROR on channel " + channel
+ " : " + error.toString());
);
catch (PubnubException e)
System.out.println(e.toString());
如果您想了解 Uber 是如何做到这一点的,请查看教程“The PubNub Connected Car Solution Kit”
所以我希望我能回答一下,Uber 是如何做到这一点的,以及如何让它变得更好:-)
【讨论】:
哦,顺便说一句:忘记 php 是为了这样的事情。对于像这样的分布式系统中的多个设备,它阻塞数据库的时间过长。在 PubNub 旁边还有其他分销商,但是当我为 Tessel.io 开发时,我与这些好人的经历非常好:-) ...是的,你也可以使用微控制器来实现你的想法!【参考方案4】:我认为一个好的解决方案是将所有业务逻辑放入一个可通过 REST 访问的 Laravel 应用程序。所以你不必更新文件两次。
“真正的”应用仅作为中间层工作并使用此 API。
例如,您可以在前面设置 Angular 应用程序。如果使用 nginx,则可以为每个域定义不同的位置。这样所有以“api”开头的请求都会被路由到你的 Laravel 应用程序。其余的路由到您的静态 Angular 应用程序。
listen 80;
server_name customer.com;
location /api
root /var/www/api;
location /
root /var/www/static/customer;
listen 80;
server_name internalarea.com;
location /api
root /var/www/api;
location /
root /var/www/static/restricted;
https://www.digitalocean.com/community/tutorials/understanding-nginx-server-and-location-block-selection-algorithms
如果您也使用 Laravel 构建您的前端应用程序,API 将成为前端系统使用的自己的 URL。对于这个请求,我喜欢使用 Zend\Http\Client,这很舒服。
【讨论】:
两个不同的应用程序将如何通信?如何通知提供者即将到来的工作? 所有数据处理都发生在“API”应用程序中,其他应用程序只是提供用户界面的远程访问门面。如果向 API 系统发送请求,它将向提供者发送电子邮件或其他内容。如果你想“实时”通知提供者,你需要每隔几秒询问一次 API 是否发生了什么事情,或者使用外部系统建立 websockets。【参考方案5】:如果您想为普通用户和提供者开发应用程序。
那我给你推荐 开发 2 个单独的应用程序和一个服务器(永远不要为任何应用程序创建不同的服务器)
或者您可以在注册时指定用户类型。
【讨论】:
您能解释一下应用程序将如何与服务器通信并相互通知吗? 您需要创建应用程序的总体架构,您可以创建API来与服务器通信。以上是关于Laravel 消费者和提供者应用架构的主要内容,如果未能解决你的问题,请参考以下文章