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 消费者和提供者应用架构的主要内容,如果未能解决你的问题,请参考以下文章

[ Laravel 5.1 文档 ] 架构 —— 应用目录结构

Spring Cloud Eureka的基础架构

微服务架构的核心关键点

C# 插件架构与插件之间的接口共享

从SOA到微服务,企业分布式应用架构在云原生时代如何重塑

Dubbo