精华内容
下载资源
问答
  • 设计模式对于复杂业务拆分应用示例,代码只是简单的实现一个可用的业务框架,具体根据需求改变,感兴趣的可以相互学习交流;
  • 基于 React 的企业管理系统开发经验,带你学习如何抽象复杂业务逻辑,帮助团队实现效能提升.pdf
  • 复杂业务流程的分析与拆分

    千次阅读 2018-10-12 13:43:29
    如果系统各个模块还没有拆分,这时对于一些很复杂业务,其中任何一个业务流程可能会多次操作数据库,尤其是当业务流程中多次出现update 或者insert的时候,如果事务处理不好就会影响性能。以下针对我们业务系统中...

    摘要

    如果系统各个模块还没有拆分,这时对于一些很复杂的业务,其中任何一个业务流程可能会多次操作数据库,尤其是当业务流程中多次出现update 或者insert的时候,如果事务处理不好就会影响性能。以下针对我们业务系统中的一个案例分析一些解决方法。

    问题描述

    当时系统使用事务管理器是:org.springframework.jdbc.datasource.DataSource TransactionManager。默认的事务传播特性是PROPAGATION_REQUIRED 。使用的事务隔离级别也是mysql默认的隔离级别REPEATABLE-READ。但是业务流程都没有显示用注解@Transactional配置事务的隔离级别,和传播特性。
    当时执行完一个复杂的业务流程后,查看mysql 执行日志看到很多SQL 在执行过程都是同一个事务ID,如下图截取了一部分。仔细分析发现整个业务流程是同一个事务ID。这表示要等到业务流程全部执行完事务才会commit,如果并发量比较大的化,会出现大量事务未提交的情况,降低MySQL执行性能,这时只能将业务流程拆分成多个事务来执行。
    在这里插入图片描述

    解决方法

    首先梳理并拆解业务流程,包括以下几个部分:
    在这里插入图片描述
    (1) 快速解决问题–同步拆分
    每个功能都单独放到一个service 类中,并且设置事务传播特性为PROPAGATION_REQUIRED_NEW。隔离级别仍然使用mysql默认的隔离级别REPEATABLE-READ。把功能拆分以后,为了保证数据得完整性和一致性,就需要加上异常处理机制。其中扣费和订单比较紧密,还是需要放到一个事务中的。最终实现方式如下图:
    在这里插入图片描述

    (2) 根本解决问题–异步拆分
    通过消息队列将各个功能模块解耦,同时添加异常处理机制,保证数据的完整性和一致性。最终是要通过微服务拆分,采用分布式的方式来处理这个问题。
    在这里插入图片描述

    (3)容错机制
    所有update 接口和insert 接口都设计为幂等接口,接口规范要注重定义请求消息的一致性。实现了一种faileback方式,不依赖dubbo 框架的failback 机制。可以利用RocketMq ACK机制, 使用 Retry队列,也可以将异常消息存储到tokuDB中,设置一个定时任务,定时处理 失败消息。系统目前采用的策略是尽最大努力一次性提交(失败概率较小),然后手动处理异常消息,同时所有流程都设计成快速失败的。

    遗留问题

    在功能优化后,系统的性能有所提升,但是容错机制不够完善。系统使用的是dubbo 微服务框架,需要考虑重试机制,以及雪崩的情况。有重试机制,就必须将各个接口都做成幂等。雪崩的情况,需要调整dubbo超时时间和使用熔断机制。
    后面会讨论这些问题。

    展开全文
  • 1为什么要拆分?先看一段对话。...各种随意的ifelse、写死逻辑散落在应用的各个角落,处处是坑,开发维护起来战战兢兢;4)系统扩展性差。系统支撑现有业务已是颤颤巍巍,不论是应用还是DB都已经无法承受
  • Android复杂页面代码拆分方法

    千次阅读 2016-05-20 11:29:43
    项目中有时候会遇到很复杂的页面,比如在同个Activity或者Fragment中要实现两个界面,本文介绍一种比较简单的拆分方法。先上效果图: 第一个界面和第二个界面,两个Button都是在自定义的View中实现点击的操做没有在...

    问题描述:

    项目中有时候会遇到很复杂的页面,比如在同个Activity或者Fragment中要实现两个界面,本文介绍一种比较简单的拆分方法。


    先上效果图:
    总体效果图

    第一个界面和第二个界面,两个Button都是在自定义的View中实现

    点击后的效果图

    点击的操做没有在主界面的Activity中实现,而是抽到第一个界面的自定义View的类中实现了。


    代码解析:

    • 自定义一个容器类,重写onFinishInflate的回调方法,在此处实现用户交互的代码。
    public class MySecondView extends FrameLayout{
        public MySecondView(Context context) {
            super(context);
        }
    
        public MySecondView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public MySecondView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        @TargetApi(Build.VERSION_CODES.LOLLIPOP)
        public MySecondView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
            super(context, attrs, defStyleAttr, defStyleRes);
        }
    
        @Override
        protected void onFinishInflate() {
            super.onFinishInflate();
            Button mButton = (Button) this.findViewById(R.id.bt_second);
            mButton.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(getContext(), "这是在MySecondView中实现的操作", Toast.LENGTH_LONG).show();
                }
            });
        }
    
    }
    • 在xml文件中引入,作为容器;
    <?xml version="1.0" encoding="utf-8"?>
    <com.ryan.gdin.myapplication.MyFirstView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    
        <Button
            android:id="@+id/bt_first"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            android:text="@string/first"/>
    </com.ryan.gdin.myapplication.MyFirstView>
    • 在MainActivity的布局文件中include进来:
     <include
            android:id="@+id/first"
            layout="@layout/my_first_layout"/>

    第二个界面的做法一样,这样处理后,在MainActivty中代码就很精简了:

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    }

    这样处理,本来一个界面的东西分成三部分,对于不复杂的界面就没必要这样处理啦,但是对于复杂的绝对是神器,方便代码维护!

    此至,抛砖引玉,献丑啦!

    展开全文
  • Sql优化之复杂sql简化拆分

    千次阅读 2011-04-21 23:00:55
    这些sql往往执行起来性能会有问题,Oracle内核解释起来也比较费劲,好多索引用不上,这时候不要灰心,试试能不能把复杂的sql拆分成几个容易理解的逻辑,再Union All再一起,性能往往会好一点。 程序是越简单越好...
    逻辑比较复杂时,写出的sql有时候会一层套一层,又是and又是or,特别难以理解。这些sql往往执行起来性能会有问题,Oracle内核解释起来也比较费劲,好多索引用不上,这时候不要灰心,试试能不能把复杂的sql拆分成几个容易理解的逻辑,再Union All再一起,性能往往会好一点。
    

    程序是越简单越好,简单是清晰的,简单是优美的,简单是高效的。人容易理解的语句,机器处理起来也便捷,O(∩_∩)O哈!
    展开全文
  • 项目业务逻辑问题整理_答案版本

    万次阅读 多人点赞 2018-01-13 19:04:15
    答:传智所学项目的业务逻辑不够复杂,模块也不多,所以建议项目周期为5-8个月。 项目团队有多少人,如何分配的? 答:项目团队一般由6-10个人组成,4-5个人是java后台的,1-2个是前端,2个产品。 在项目中充当什么...
    1. 项目周期?

      答:xx所学项目的业务逻辑不够复杂,模块也不多,所以建议项目周期为5-8个月。

    2. 项目团队有多少人,如何分配的?

      答:项目团队一般由6-10个人组成,4-5个人是java后台的,1-2个是前端,2个产品。

    3. 在项目中充当什么样的角色?

      答:在项目中的职位是组员或者组长,主要负责开发功能模块,后期配合测试修改bug。

      看工作时间与入职的时间,在一家公司入职时间少于1年并且从事开发少于2年很少有机会担任小组领导

    4. 项目中遇到的最大的问题是什么?

      答:这种问题不要说一般的错误,尽量说业务上的问题。例如:单点登录的时候如何解决多系统之间用户登录信息同步以及用户信息共享;登录需要发送短信验证码的时候如何保证消息到达率是100%;如何实现redis与数据库信息同步;开发环境程序正常,生产环境程序bug

      等。

    5. 如何保证所负责与需求相符合?

      答:在做模块之前,与产品经理确定好需求,再与项目负责人确定好技术选型应用,在开发过程中遇到业务问题与产品经理和项目负责人及时沟通。

    6. 你觉得做商品模块(首页展示、轮播图、购物车、单点登录、订单)时的难点在哪里?

      答:商品模块:添加或者修改商品时,数据库、redis、静态页面如何同步信息。

      购物车:添加的商品数量与库存数量的对比。商品价格变动同步。购物车的存储。

      单点登录:如何进行多系统之间的信息交互。(主要指验证登录信息)子系统如何保证登录信息的安全。

      订单:商品数量与库存的同步,商品价格的准确性。提交订单的方式,如何验证订单。

    7. 所负责模块里有哪些功能?(不要上来就说增删改查)

      答:商品模块的功能:添加商品时,商品图片的上传以及存储,商品价格确保准确性,商品的上下架。也可以简单介绍下查询的各种条件或删除的各种条件。以及商品信息同步(数据库、redis、静态页面等),商品id的生成规则。

    8. 在项目开发过程中遇到不会的功能是如何处理的?

      答:技术问题:首先是谷歌,在网上查看各种资料以及博客。其次是与同事交流。最后再去找领导。

      业务问题:业务问题首先找经理沟通,技术问题首先google百度

    9. 项目中前台与后台是如何进行数据交互的?

      答:ajax,http请求,socket。

    10. 如何实现数据库与redis同步?

      答:用消息队列mq实现。具体操作是在添加或者修改数据的时候,用mq来同步到数据库与redis,加上事务,确保reids与数据库数据一致。

    11. 在项目开发过程中还有哪些工作内容?

      答:与项目经理去客户公司确定用户需求,与同事配合完成单元测试,与测试人员配合完成测试并修改bug,bug提交

    12. 项目共有多少张表?所做模块用到多少张表?表与表之间的关系?

      答:180-220(选一个具体数值)。

      商品模块:商品表,库存表,品牌表,分类表,商品详情表,规格表,图片表,商品排序表,商品筛选表,图片资源类型表,图片资源表,商品日志表,晒单图片说明表。

      购物车:商品表,品牌表,分类表,库存表,用户表,库房表,购物车表,购物项表,优惠券表,商品推荐表。

      订单:订单表,用户表,用户地址表,商品表,品牌表,分类表,库存表,库房表,地区表,物流信息表。

      登录(后台):用户表,权限表,角色表,用户角色表,权限角色表,日志表。

    13. 插入商品的话,要求级联插入几张表,你们当时是怎么实现的?

      答:商品表,商品详情表,库存表,图片表,日志表。

    14. 项目中用的注解开发还是手动注入?分别如何实现?为什么?

      答:注解开发,在类、属性、方法上写注解。因为项目中需要配置的太多,用注解可以简化开发。

    15. 错误日志的处理?项目中的日志文件存在哪里?保存多长时间?

      答:看日志大小存放, 一般是15天或者30天。存放在一个单独的服务器目录。

    16. 生产环境与开发环境在上线部署的时候应该如何配置?

      答:生产环境:

      1、上线之前备份之前的项目

      2、修改上线项目的相关配置

      3、关停服务

      4、替换之前的项目

      5、启动服务,观察日志,是否异常

    17. 开发时数据库中数据从哪来?数据量有多大?

      答:开发时数据库数据部分来自客户或者运营,部分自己添加,部分来自网络爬虫扒的数据。

    18. 如何保证库存?

      答:用mq+redis。

    19. 如果日志存储量过大如何处理?

      答:定期清除日志,日志一般存放在另一台服务器上,15-30天清理一次。

    20. 在项目开发过程中如何进行测试?压力测试如何做?

      答:对自己所负责模块进行单元测试,然后交给公司测试人员进行测试。一般压力测试都是测试人员做,Visual
      Studio 自带的工具,还有Loader
      Runner(LR),轻量级的工具有Apache项目中的ApacheBench。

    21. 项目的并发量有多大?用了多少台服务器?

      答:并发量500-1000,服务器数量一般是10-20台左右,具体数量看图

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gLXpYOOE-1621839483643)(media/image1.png)]{width=“6.393055555555556in”
      height=“3.770138888888889in”}

    22. 在项目中,是如何分配开发任务的?

      答:开会时,由项目经理与组长分配到个人需要负责开发的功能模块。

    23. 项目中的技术选型的依据是什么?

      答:1.什么技术更适合当前项目的业务需求,例如互联网项目查询条件比较多,数据库框架选用mybatis;传统项目查询条件比较单一,选用hibernate比较合适。

      2.如果两个技术都适用于项目,就看架构师更熟悉哪个技术,因为如果大部分开发人员都不会,企业会负担很高的学习成本。

    24. 项目的安全问题是如何解决的?

      答:单点登录用token来校验。或者可以说有专门负责项目安全的人员。或者说花钱买服务。

      环境安全:初期通过购买云服务

      程序安全;token +签名

    25. 用户分为几种?每种所对应的权限?权限具体是如何实现的?

      答:一般后天项目中普通用户、普通管理员、超级管理员。用shiro框架具体实现。

      普通用户:访问。普通管理员:管理后台信息。超级管理员:所有权限。

    26. 电商项目是否上线?用户量有多少?

      答:可以说上线(找一个地方性的小型电商网站)或者测试没有完成,项目还没有上线。可以说用户量有日活量:几千。

    27. 商品的属性是如何进行存储的?

      答:需要存储到商品表,商品详情表,库存表,日志表等。

    28. 工作之余有没有在研究一些流行的技术?

      答:有,再看一些技术博客。比如说跨域,如何解决高并发,不同系统之间的通信。

    29. 在项目中如何实现页面跳转并把当前页面数据传递到跳转页面?

      答:把要传递的数据放在request域中(转发)。

    30. 所负责模块的查询都有那些条件?那些是静态条件、哪些是动态条件?

      答:商品的价格区间,商品的品牌,商品的分类,型号,颜色,大小,男/女,商品名称。

      静态条件:商品的价格区间,商品的品牌,商品的分类,型号,颜色,大小,男/女

      动态条件:商品名称,商品类型

    31. 所负责模块中删除数据的时候直接删除就可以么?如果不是需要做哪些操作?

      答:如果单表的可以进行逻辑删除,不会进行物理删除。级联删除,删除该条数据不影响到其他表中的数据就可以直接删除,否则要进行级联删除,这里也是指的逻辑删除。

    32. 支付是如何做的?

      答:与支付宝、微信对接,下载它们两个的SDK(jar包),需要配置公钥与私钥,进行对接,根据官方文档的API,调用相关支付的借口,接收回调信息(成功或失败)。进一步做自己的业务逻辑操作。

    33. 表是如何设计的?

      答:可以说是项目经理或者架构师设计的。自己所负责模块可以根据项目需求来设计有哪些字段,需要关联到哪些表。尽量推行单表设计,不定义外键约束。

    34. 面向服务通过什么样的方式实现?

      答:soa架构,表现层与服务层分离,用dubbo和zookeeper搭配完成。

    35. 如何提高代码质量?在项目中如何优化代码?

      答:尽量减少不必要的操作,尽量不要用到三层以上的for循环与递归。写代码的时候要给关键代码写上注释。相同功能的代码进行抽取,抽取原则不影响功能的正常运行。

    36. 商品的审核如何做的?

      答:添加或者修改,商品的价格以及库存等重要信息要进行二次填写,以保证准确率。

      前台js校验,后台java代码校验。

    37. 在项目中如何调试bug?

      答:1.以dug方式运行项目,打断点调试。2.查看项目中的错误日志。3.测试人员使用专业测试工具进行测试。4.运行脚本对代码进行测试。

    38. 查询商品的时候如果redis没有数据,可以抛异常么?如果不可以如何做?

      答:不可以用throws抛异常,可以用trycatch捕获异常。因为在redis中查询不到数据,还要对数据库进行查询,如果throws抛异常则不能按正常业务运行。

    39. 购物车如何实现的?未登录可以用购物车么?购物车的存储?

      答:购物车有三种。1.存放在Cookie。2.放在缓存里面。3.放到数据库里面。

      未登录的时候可以放在cookie中,但是有的电商网站针对未登录用户不提供购物车功能。(例如天猫、淘宝添加商品到购物车的时候必须先登录)

    40. 购物车里面商品种类可以无限添加么?同一种商品的数量有限制么?

      答:不可以,京东最多只可以添加八十种(足够使用了),避免占用太多存储空间;商品数量根据商品类型来控制,一般不超过200种。

    41. 如果库存数量少于购物车用户添加的数量如何处理?

      答:每次用户访问购物车的时候,都发送ajax请求查询一遍redis或者数据库,如果存库数量少于购物车中商品数量,发送消息进行提示,并做相应修改。

    42. 生成订单具备的条件?如何保证这些条件?

      答:商品数量不能超过限制数量和库存数量。限制数量在前台用js校验,后台查询数据库校验库存。

    43. 首页展示的轮播图,在页面中是如何存放的?在数据库中是如何存放的?

      答:页面中存放的是图片地址,在数据库中存放的也是图片的地址。图片存放在另一台服务器上面。

    44. 用户地址是如何保存实现的?(具体)

      答:用户的地址是单独存放在一张数据库表中的,需要绑定用户的id,还需要设置默认路径。

    45. 在电商项目中如何针对不同的用户做推送?

      答:对用户的浏览内容做一下记录,然后在页面的下方或者右方做商品的推送。还有一种就是针对用户购物车或者关注商品做促销信息推送。

    46. 如何迁移数据库(mysql)?

      答:这里介绍的是mysql数据库,如果被问到其他的可以说只知道mysql的。

      1.数据库直接导出,拷贝文件到新服务器,在新服务器上导入。

      2.使用【MySQL GUI Tools】中的 MySQLMigrationTool。

      3.数据文件和库表结构文件直接拷贝到新服务器,挂载到同样配置的MySQL服务下。

      我在我的电脑上用虚拟机测试后,选中了占用时间最少的第三种方案。下面是三种方案的对比:第一种方案的优点:会重建数据文件,减少数据文件的占用空间。\

      第一种方案的缺点:时间占用长。(导入导出都需要很长的时间,并且导出后的文件还要经过网络传输,也要占用一定的时间。)

      第二种方案的优点:设置完成后传输无人值守\

      第二种方案的缺点:设置繁琐。传输中网络出现异常,不能及时的被发现,并且会一直停留在数据传输的状态不能被停止,如不仔细观察不会被发现异常。 传输相对其他fang时间长。 异常后很难从异常的位置继续传输。

      第三种方案的优点:时间占用短,文件可断点传输。操作步骤少。(绝大部分时间都是在文件的网络传输)
      第三种方案的缺点:可能引起未知问题,暂时未发现。

    47. 服务器宕机如何处理?全部宕机如何处理?

      答:配置主从服务器,运维人员搭建集群后,从服务器会给主服务器发送信息,如果主服务器没有响应,那就启用从服务器。一般不会全部宕机,如果全部挂掉,就重启。

    48. 一件商品只有2件,现在被他人购买一件,这边如何修改当前用户的商品信息?

      答:这个考察的是对库存的安全校验。商品上架多少 库存 讲库存缓存在redis 中 下单 就在redis 减少,异步 在库存数据库中也减少商品 查询只查询redis 中的 商品库存更新后 更新redis 库存;在用户点击添加到购物车按钮时,发送ajax查询redis。

      dubbo服务开发流程,运行流程?zookeeper注册中心的作用?端口是多少?

      答:dubbo主要是发布服务和调用服务。

      使用流程:

      第一步:要在系统中使用dubbo应该先搭建一个注册中心,一般推荐使用zookeeper。

      第二步:有了注册中心然后是发布服务,发布服务需要使用spring容器和dubbo标签来发布服务。并且发布服务时需要指定注册中心的位置。

      第三步:服务发布之后就是调用服务。一般调用服务也是使用spring容器和dubbo标签来引用服务,这样就可以在客户端的容器中生成一个服务的代理对象,在action或者Controller中直接调用service的方法即可。

      Zookeeper注册中心的作用主要就是注册和发现服务的作用。类似于房产中介的作用,在系统中并不参与服务的调用及数据的传输。

    49. 消息中间件acitveMQ的作用、原理?几种模式,每种的特点及使用问题?MQ发送消息失败怎么办?

      答:Activemq的作用就是系统之间进行通信。当然可以使用其他方式进行系统间通信,如果使用Activemq的话可以对系统之间的调用进行解耦,实现系统间的异步通信。原理就是生产者生产消息,把消息发送给activemq。Activemq接收到消息,然后查看有多少个消费者,然后把消息转发给消费者,此过程中生产者无需参与。消费者接收到消息后做相应的处理和生产者没有任何关系。

    Activemq有两种通信方式,点到点形式和发布订阅模式。如果是点到点模式的话,如果消息发送不成功此消息默认会保存到activemq服务端知道有消费者将其消费,所以此时消息是不会丢失的。如果是发布订阅模式的通信方式,默认情况下只通知一次,如果接收不到此消息就没有了。这种场景只适用于对消息送达率要求不高的情况。如果要求消息必须送达不可以丢失的话,需要配置持久订阅。每个订阅端定义一个id,在订阅是向activemq注册。发布消息和接收消息时需要配置发送模式为持久化。此时如果客户端接收不到消息,消息会持久化到服务端,直到客户端正常接收后为止。

    1. Tomcat集群中怎么实现共享

      答:用dubbo与zookeeper配合来实现tomcat共享。

      1,tomcat自身提供的session集群共享

      2,编写tomcat的session插件对session进行存储

      3,使用javaweb规范中的filter对request对象的getSessio()进行拦截替换实现集群共享

    2. 前台做过静态页面么?Freemark如何生成静态页面?生成模板的命令?

    答:做过。

    第一步:创建一个Configuration对象,直接new一个对象。构造方法的参数就是freemarker对于的版本号。

    第二步:设置模板文件所在的路径。

    第三步:设置模板文件使用的字符集。一般就是utf-8.

    第四步:加载一个模板,创建一个模板对象。

    第五步:创建一个模板使用的数据集,可以是pojo也可以是map。一般是Map。

    第六步:创建一个Writer对象,一般创建一FileWriter对象,指定生成的文件名。

    第七步:调用模板对象的process方法输出文件。

    第八步:关闭流。


    @Test

    public void genFile() throws Exception {

    // 第一步:创建一个Configuration对象,直接new一个对象。构造方法的参数就是freemarker对于的版本号。

    Configuration configuration = new Configuration(Configuration.getVersion());

    // 第二步:设置模板文件所在的路径。

    configuration.setDirectoryForTemplateLoading(new File(“D:/workspaces-itcast/term197/e3-item-web/src/main/webapp/WEB-INF/ftl”));

    // 第三步:设置模板文件使用的字符集。一般就是utf-8.

    configuration.setDefaultEncoding(“utf-8”);

    // 第四步:加载一个模板,创建一个模板对象。

    Template template = configuration.getTemplate(“hello.ftl”);

    // 第五步:创建一个模板使用的数据集,可以是pojo也可以是map。一般是Map。

    Map dataModel = new HashMap<>();

    //向数据集中添加数据

    dataModel.put(“hello”, “this is my first freemarker test.”);

    // 第六步:创建一个Writer对象,一般创建一FileWriter对象,指定生成的文件名。

    Writer out = new FileWriter(new File(“D:/temp/term197/out/hello.html”));

    // 第七步:调用模板对象的process方法输出文件。

    template.process(dataModel, out);

    // 第八步:关闭流。

    out.close();

    }

    1. 什么是存储过程?好处?

      答:存储过程可以说是一个记录集吧,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用他就行了。

      好处:1.由于数据库执行动作时,是先编译后执行的。然而存储过程是一个编译过的代码块,所以执行效率要比T-SQL语句高。2.一个存储过程在程序在网络中交互时可以替代大堆的T-SQL语句,所以也能降低网络的通信量,提高通信速率。3.通过存储过程能够使没有权限的用户在控制之下间接地存取数据库,从而确保数据的安全。

    2. Shiro如何进行权限控制?

      答:1.通过浏览器访问路径,配置文件查看,是否需要认证等,如果不需要,直接访问controller

      2.如果需要认证,通过配置文件的loginUrl,跳到这个地址,输入用户名、密码等

      3.登录:1.访问自定义的form表单过滤器FormAuthenticationFilter(自己起的名字和shiro一样了,所以。。)的createToken方法,装配token;如果没有自定义表单过滤器,默认的FormAuthenticationFilter会自动装配表单token2.访问自定义realms的认证方法doGetAuthenticationInfo(),查库(或者缓存),判断用户名和密码是否正确。

      4.如果登录之后访问的url,通过配置文件里的配置需要权限:调用自定义realms的授权方法:doGetAuthorizationInfo(),查库(或者缓存),查出用户权限,判断是否拥有权限,没权访问,跳到响应的refuse配置的路径,有权访问,跳到响应的url

    3. solr的原理?分词器的原理?如何设置高亮显示?

      答:Solr是基于Lucene开发的全文检索服务器,而Lucene就是一套实现了全文检索的api,其本质就是一个全文检索的过程。全文检索就是把原始文档根据一定的规则拆分成若干个关键词,然后根据关键词创建索引,当查询时先查询索引找到对应的关键词,并根据关键词找到对应的文档,也就是查询结果,最终把查询结果展示给用户的过程。

      IK分析器的分词原理本质上是词典分词。现在内存中初始化一个词典,然后在分词过程中逐个读取字符,和字典中的字符相匹配,把文档中的所有的词语拆分出来的过程。

    4. 秒杀功能能否与正常的商品购买放在同一台服务器上?

    答:可以,但是尽量不要这么做。因为秒杀商品,抢购的用户会比较多,并发量过高容易引起宕机,导致正常购买商品功能也不能正常使用,所以建议放在不同服务器上。

    1. redis是内存数据库,如果宕机了,如何解决数据丢失的问题?

      答:方案一:redis拥有两种不同形式的持久化方法,它们都可以用小而紧凑的格式将存储在内存中的数据写入硬盘:第一种持久化方法为时间点转储,转储操作既可以在“指定时间段内有指定数量的写操作执行”这一条件被满足时执行,又可以通过条用两条转储到硬盘中命令中的任何一条来执行;第二种持久化方法将所有修改了数据库的命令都写入一个只追加文件里面,用户可以根据数据的重要程度,将只追加写入设置为从不同步、每秒同步一次或者每写入一个命令就同步一次。

      方案二:使用redis集群。Redis实现了主从复制的特性:执行复制的从服务器会连接上主服务器,接受主服务器发送的整个数据库的初始副本;之后主服务器执行的写命令,都会被发送给所有连接着的从服务器去执行,从而实时地更新从服务器的数据集。因为从服务器包含的数据会不断地进行更新,所以客户端可以向任意一个从服务器发送读请求,以此来避免对主服务器进行集中式的访问。

    2. 商品存入数据库怎么保证数据库数据安全?

      答:设置后台用户的权限,并对数据库修改做好记录(日志),保证责任到人。

    3. 项目中商品小图片点开后,单品页面是大图片,这些图片是如何处理的?

      答:在小图片上设置连接,点击小图片后,加载大图片。

      62.项目中的网络安全是怎么做的?

      答:设置防火墙,买服务。

      63.solr优化怎么实现?

      答:http://blog.csdn.net/kuyuyingzi/article/details/17651451

      64concurrent这个包有什么特性?

      答:http://blog.csdn.net/defonds/article/details/44021605/

    展开全文
  • 1、业务逻辑、流程本身就复杂,而且有很多定制的小细节 2、后端soa化之后,相同功能抽象成服务,在一个模块中,往往集成了原来各个产品线的逻辑,业务分支极具增大,导致代码里面充斥这if else、重复代码、大代码段...
  • 20.如何从app业务逻辑提炼api接口

    万次阅读 2015-03-23 12:54:30
    在app后端的工作中,设计api是一个很考验设计能力的工作。在项目的初始阶段,只知道具体的业务逻辑,那怎么把业务逻辑抽象和提炼,设计出api呢?通过阅读本文,可解答以上疑惑。
  • 订单生产线分配以及拆分逻辑实现

    千次阅读 热门讨论 2017-09-17 23:09:54
    由于公司需要实现订单处理,分拣,验收,打包,出库的一体化操作,所以衍生了我们这次做的这一版的进销存的订单的业务逻辑处理流程这个的实现了。因为逻辑不是很复杂,只是步骤比较繁琐,所以来依次说明。 一、...
  • 关于一些业务逻辑的处理技巧

    千次阅读 2016-10-17 16:44:03
    写一些较复杂业务逻辑时有哪些地方需要注意呢? (1)复杂的业务相对的经常有频繁访问固定数据的情况: 这时读取数据,尽量一次性读取出来,然后存入对象中,后面用到哪个就从对象中取就好了。这样往往可以节省...
  • SQLServer复杂SQL逻辑实现

    千次阅读 2015-07-19 00:29:24
    一、问题 如下图,已有表a与表b的数据,如何通过SQL...表c是从表a中取出表b上限值以下的分录,若分录的SumSalary值大于b表的Salary,则拆分出刚好汇总等于b表的Salary数。 表A的SQL语句: create table b( Use
  • 如何从app业务逻辑提炼api接口

    千次阅读 2015-08-08 10:30:40
    在项目的初始阶段,只知道具体的业务逻辑,那怎么把业务逻辑抽象和提炼,设计出api呢?通过阅读本文,可解答以上疑惑。    在本文中,是用以前做过的app移客ekeo第一版(以后的业务逻辑改了很多)业务逻辑来...
  • 项目二业务逻辑整理 非常有用

    千次阅读 2018-06-29 20:25:00
    答:传智所学项目的业务逻辑不够复杂,模块也不多,所以建议项目周期为5-8个月。 2.项目团队有多少人,如何分配的? 答:项目团队一般由6-10个人组成,4-5个人是java后台的,1-2个是前端,2个产品。 3.在项目中...
  • 斗地主AI算法——第一章の业务逻辑

    万次阅读 多人点赞 2017-04-26 15:27:24
    转眼间快到了五月,帝都的天气也变的非常梦幻。...以上就是针对斗地主AI实现方法的基本概念,业务逻辑确立之后,我们便可以进行开发了。 敬请关注下一章:斗地主AI算法——第二章の数据结构
  • 基于命令模式的业务逻辑层设计

    千次阅读 2011-03-20 18:42:00
    业务发展太快,需求不停的在变 目前作的业务系统业务逻辑非常复杂,网站承载的用户访问量也在逐渐增大,更要命的是需求的不确定性,天天都有新需求,每次的改动量都比较大,而且很多时候几个团队拉同一个分支来开发...
  • 游戏任务成就体系的实现(二):业务拆分和大功能模块定位
  • 之前文章中我们介绍了如何使用MyCat进行读写分离,类似的关系型数据库的读写分离存储方案可以在保持上层业务系统透明度的基础上满足70%业务系统...所以我们还需要进一步使用MyCat的分片技术对业务数据表进行横向拆分
  • App组件化与业务拆分那些事

    千次阅读 2017-01-03 12:57:15
    无论是组件化还是模块化,目标都是把臃肿的工程,拆分为更小的部分,解耦各种复杂逻辑,便于代码管理。 4 业务划分   一个产品的业务,其实是在规划产品功能,或者做产品原型时,已经定好...
  • 使用vue解决复杂逻辑

    千次阅读 2017-12-14 03:04:34
    一,动态树形结构渲染 原型图 问题 后台需要提供提供怎样的的数据结构 页面渲染如何实现 如何拿到输入框的值 解决思路 ...每一条数据需要提供第一个select的options选项;后面的文本框需要输入类型;...
  • 上文提到MyCat的逻辑表支持多种分片规则,表现于schema配置文件中中table标签的rule属性。本节将以MyCat Version 1.6版为基础,介绍几种经常使用的分片规则,这些分片规则都通过rule.xml文件进行定义和配置。
  • 主要是将传统的业务逻辑拆分成应用层、领域层和基础实施层。如下图所示,左边是传统的分层架构,右边是 COLA 的分层架构。 其每一层的作用范围和含义如下: 1)展现层(Presentation Layer) 负责以 Rest 的格式...
  • 如何写出复杂业务查询的sql语句

    千次阅读 2018-03-16 15:01:41
    如何写出复杂业务查询的sql语句如何写出复杂的sql语句:首先要建立一个概念,复杂的sql语句也是最基本的sql语句连接而成,所以最重要的是先要理清思路和逻辑,弄清自己要查哪几张表,要用哪几个字段,表之间如何关联...
  • 同步更新博客: cnblogs: 深耕业务 ---- 探索复杂/超复杂前端业务的开发与设计 知乎:深耕业务 ---- 探索复杂/超复杂前端业务的开发与设计 github:深耕业务 ---- 探索复杂/超复杂前端业务的开发与设计 距离上...
  • 应用架构之道:分离业务逻辑和技术细节

    千次阅读 多人点赞 2019-07-04 07:28:00
    主要是将传统的业务逻辑拆分成应用层、领域层和基础实施层。如下图所示,左边是传统的分层架构,右边是COLA的分层架构。 其每一层的作用范围和含义如下: 1)展现层(Presentation Layer):负责以Rest的格式...
  • 复杂需求用户故事拆分可遵循3个原则、9种方法。   像惠普和中兴通讯这样的大型跨国公司都有规模庞大的研发组织,建立了敏捷教练团队,并在研发组织中广泛推广敏捷项目管理。我曾经在这两家公司参加了敏捷项目的...
  • 自己作为一名工作不足一年的程序员,来谈怎样写好复杂业务代码这个话题是很惶恐的,尽管有注明加上新手程序员的对象,但有些心得很想和大家交流。自己工作以来,一直在看设计模式和代码整洁的书,平常工作内容主要是...
  • 编写步骤: 1. 定义一个通用的业务接口 public interface SingleOperation&...2. 在Service实现类中定义一个复杂业务处理包装子类比如:创建付款单业务【CreatePayment】去实现SingleOperation接口 /** * 创建...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 64,340
精华内容 25,736
关键字:

复杂业务逻辑拆分