【问题标题】:Building a Java based stock trading application, need pointers for technologies to use构建基于 Java 的股票交易应用程序,需要使用技术的指针
【发布时间】:2010-11-05 01:09:42
【问题描述】:

我正在用 Java(带有 jQ​​uery 前端)构建一个需要与第三方应用程序对话的应用程序。最多每两秒更新一次界面。

使用彗星会是个好主意吗?如果是这样,它们如何融入图片中?

我可以使用哪些其他方式/技术来改进应用程序?

该应用程序将从第三方应用程序轮询股票价格,将其写入数据库,然后每秒将其推送到前端,对于轮询,我有一个每秒运行的计时器来调用第三方应用程序数据,然后我必须使用JSP或其他东西将它显示到前端,

现在我不确定我是否应该使用 servlet 将它写到前端,你会推荐什么?我应该怎么做?

有什么新技术可以代替 servlet 吗?

我也在使用 Berkeley db 来存储数据,你认为它是一个不错的选择吗?如果使用 berkeley 有什么缺点的话..

我完全一无所知,所以任何建议都将不胜感激。

谢谢!

编辑:我打算这样做,以便桌面应用程序不断从第三部分轮询并写入数据库,而网络应用程序只从数据库读取和显示,这将减少网络应用程序的负载和所有它要做的是从数据库中读取。

【问题讨论】:

    标签: java jquery jsp web-applications berkeley-db


    【解决方案1】:

    您的意图是构建一个显示实时数据的 Web UI,例如:时间、市场数据等...

    我个人使用的技术之一是Web Firm Framework,它是一个在Apache License 2.0 下的开源framework。它是一个用于构建 Web UI 的 Java 服务器端框架。对于每个标签和属性,都有一个对应的 java 类。我们只是用 Java 代码而不是纯 HTML 和 JavaScript 构建 UI。优点是我们在服务器标签和属性对象中所做的任何更改都将反映到浏览器页面,而无需客户端的任何显式触发。在您的情况下,我们可以简单地使用 ScheduledExecutorService 在 UI 中进行数据更改。

    例如:

    AtomicReference<BigDecimal> oneUSDToOneGBPRef = new AtomicReference<>(new BigDecimal("0.77"));
    
    SharedTagContent<BigDecimal> amountInBaseCurrencyUSD = new SharedTagContent<>(BigDecimal.ZERO);
    
    Div usdToGBPDataDiv = new Div(null).give(dv -> {
    
        //the second argument is formatter
        new Span(dv).subscribeTo(amountInBaseCurrencyUSD, content -> {
            BigDecimal amountInUSD = content.getContent();
            if (amountInUSD != null) {
                return new SharedTagContent.Content<>(amountInUSD.toPlainString(), false);
            }
            return new SharedTagContent.Content<>("-", false);
        });
    
        new Span(dv).give(spn -> {
            new NoTag(spn, " USD to GBP: ");
        });
    
        new Span(dv).subscribeTo(amountInBaseCurrencyUSD, content -> {
    
            BigDecimal amountInUSD = content.getContent();
            if (amountInUSD != null) {
    
                BigDecimal oneUSDToOneGBP = oneUSDToOneGBPRef.get();
    
                BigDecimal usdToGBP = amountInUSD.multiply(oneUSDToOneGBP);
    
                return new SharedTagContent.Content<>(usdToGBP.toPlainString(), false);
            }
            return new SharedTagContent.Content<>("-", false);
        });
    });
    
    amountInBaseCurrencyUSD.setContent(BigDecimal.ONE);
    
    //just to test
    // will print <div><span>1</span><span> USD to GBP: </span><span>0.77</span></div>
    System.out.println(usdToGBPDataDiv.toHtmlString());
    
    
    ScheduledExecutorService scheduledExecutorService =
            Executors.newScheduledThreadPool(1);
    
    Runnable task = () -> {
    
        //dynamically get USD to GBP exchange value
        oneUSDToOneGBPRef.set(new BigDecimal("0.77"));
    
        //to update latest converted value
        amountInBaseCurrencyUSD.setContent(amountInBaseCurrencyUSD.getContent());
    };
    ScheduledFuture scheduledFuture = scheduledExecutorService.schedule(task, 1, TimeUnit.SECONDS);
    
    //to cancel the realtime update
    //scheduledFuture.cancel(false);
    

    要实时显示时间,您可以使用SharedTagContent&lt;Date&gt;ContentFormatter&lt;Date&gt; 显示特定时区的时间。您可以观看this video 以获得更好的理解。您也可以从this github repository下载示例项目。

    【讨论】:

      【解决方案2】:

      这真的是一个股票交易应用程序吗?还是只是一个股价显示应用程序?我问是因为从你的描述听起来像后者。

      每秒轮询一次数据有多重要?具体来说,如果某些民意调查迟到一两秒,这会很重要吗?

      如果您正在构建一个股票交易应用程序(其中时间是绝对关键的),或者如果您无法承受投票延迟,我建议您查看以下 Java 实时解决方案之一:

      除此之外,我唯一的建议是您坚持良好的 OO 设计实践。例如,使用 DAO 写入数据库,这样,如果您发现 Berkeley DB 不适合您,您可以相对轻松地切换到关系数据库系统。如果您决定需要它,它还可以让您轻松转向某些数据库分区解决方案(例如,Hibernate Shards)。

      虽然我可能有自己的技术偏好(例如,我会选择 Spring MVC 作为其他人提到的前端,但我会尝试使用 Hibernate 来实现持久性),但我真的不能声称这些会比其他技术更好。如果符合要求,请选择您熟悉的东西。

      【讨论】:

      • 您好,感谢您的 cmets,他们真的很有帮助,我必须在问题中说得更清楚,我不是在构建股票交易应用程序,而是构建价格显示应用程序,如您所说,抱歉错误。
      【解决方案3】:

      我认为在选择关注可扩展性和可扩展性的技术之前,您应该专注于您的架构设计。一旦架构设计到位,您就可以查看可用的内容以及需要构建的内容,所有这些都应该非常明显。

      虽然无法直接比较 Google、eBay 和 YouTube 如何处理它们面临的可扩展性问题。虽然交易系统不会遇到这些人在用户数量上遇到的问题,但您会遇到数据量和及时处理价格变动的类似问题。

      伦敦证交所已有 3000 个名字,再乘以全球大约 10 个受欢迎的交易所,您就会得到在每个市场开放期间不断更新的大量数据。为了让您了解从单个交换中捕获数据所涉及的内容,请查看http://kx.com/

      从数据库的角度来看,您将需要具有工业实力的东西来支持集群并具有可靠的复制 - 对我来说,这意味着 Oracle。您还想查看Time-series Database Design,根据我的经验,这是构建此类系统的最佳方式。

      同样的扩展性和可靠性要求将适用于您的应用程序服务器,其中 JBoss 是合乎逻辑的选择,尽管我也会考虑 OSGi Spring 服务器 (http://www.springsource.com/products/dmserver),因为它的轻量级特性可以使其更快。

      您还需要 Apache 服务器来实现负载平衡和提供静态内容 - 快速 Google 会找到大量相关信息,因此我不会在此重复。

      也忘记轮询,它不会扩展。查看使用消息传递和消费者进程进行跨进程通信,使用事件和工作线程进行进程内通信。这两种技术都实现了自然的负载平衡效果,可以根据需要增加消费者进程或工作线程的数量来进行调整。

      另外一个静态前端也不会减少芥末,恕我直言。看看市场上已经出现了什么——CNC Markets、IG Index 等都有非常令人印象深刻的实时交易应用程序。

      顺便说一句,假设这是一个商业项目,并不意味着让整个事情变得沮丧,CNC Markets、IG Index 等公司从交易费中赚钱,软件是达到目的的一种手段,您只需拥有一个帐户即可免费访问。交易软件的另一个目标是商业机构,例如银行、投资经理等。我想要一个非常严密的计划,以便在花费太多时间和精力之前如何打入这些市场。

      【讨论】:

        【解决方案4】:

        看看使用 Web 应用程序框架而不是 Servlets - 除非它是一个非常基本的项目,只有一个屏幕。不幸的是,Java 世界中有很多东西,它可能有点像雷区。坚持使用 SpringMVC 或 Struts 2,最糟糕的部分是设置它们,但看看一个示例应用程序和一两个教程,然后从那里开始工作。

        http://www.springsource.org/about

        http://struts.apache.org/2.x/index.html

        另一种选择是使用 Appfuse 等模板框架来启动和运行,而无需将大量框架集成在一起,请参阅:

        http://appfuse.org/display/APF/AppFuse+QuickStart

        它为您提供了一个模板来设置 SpringMVC,其中 MySQL 作为数据库,Spring 作为 POJO 框架。这可能是一种快速启动和构建原型的方法。

        根据您 2 秒的延迟要求来判断,查看某种 AJAX 框架是明智的 - JQuery 或 Prototype/Scriptaculous 都是不错的起点。

        http://jquery.com/

        http://www.prototypejs.org/

        就使事情变得更好的其他技术而言,您需要考虑构建系统,Ant/Maven 与 Maven 很好,两者中稍微复杂一些。

        http://ant.apache.org/

        http://maven.apache.org/download.html

        另外,考虑使用 JUnit 来测试应用程序。您可能需要考虑将 Selenium 用于前端的功能测试。

        http://www.junit.org

        http://seleniumhq.org/

        【讨论】:

        • 嗨,谢谢你的建议,这很有帮助,而且,我打算这样做,以便桌面应用程序不断从第三部分轮询并写入数据库,而网络应用程序只读取并从数据库中显示,这将减少 Web 应用程序的负载,它所要做的就是从数据库中读取。
        【解决方案5】:

        PostgreSQL 可能是正确的数据库。它比 MySQL 更进取一点。至于前端,有很多东西可以“放在”servlet、SpringMVC、Tapestry 等等之上。实际的 servlet 实现将对您隐藏。

        很多人会建议,使用 Spring 配置应用程序并进行任何依赖注入可能不是一个坏建议。

        如果您正在寻找更轻量级的东西,您可以考虑使用 grails。它可以快速发展和成熟。

        确实,如果不知道这将是什么样的“生产”环境,就很难推荐一些东西。我们在谈论很多交易吗? (当然,这是一个股票交易程序,但它是一个有少量用户的模拟等等......)建议事情很有趣,但如果你是认真的,我不确定我会开始一个像这样的重大项目这。有很多方法可以做到这一点,也有很多方法可以做到这一点。

        【讨论】:

        • 好吧,我知道你从哪里来,但我想从某个地方开始,也许会逐步朝着这个方向努力,我知道有很多事情我们可能会出错,但有一些好的建议,我可能无法正确处理大部分内容:) 该应用程序有很多事务,因为它每秒(至少)更新并将值存储到数据库,然后我的客户有一些公司客户,所以会有相当多的用户使用它,最终会在几年内变得更大,但我需要建议来构建它,以免它被塞满。谢谢你的建议,真的很好:)
        • 另外,编辑:我打算这样做,以便桌面应用程序不断从第三部分轮询并写入数据库,而 Web 应用程序仅从数据库读取和显示,这将减少加载到 web 应用程序上,它所要做的就是从 db 中读取。
        猜你喜欢
        • 2017-12-05
        • 2023-03-07
        • 2015-03-02
        • 1970-01-01
        • 2011-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-26
        相关资源
        最近更新 更多