精华内容
下载资源
问答
  • 分布式系统接口如何保证幂等性

    万次阅读 2020-08-15 18:32:14
    分布式系统接口如何保证幂等性 接口幂等性 为了防止上述情况的发生,我们需要提供一个防护措施,对于同一笔支付信息如果我其中某一次处理成功了,我虽然又接收到了消息,但是这时我不处理了,即保证接口的 幂等性。 ...

    分布式系统接口如何保证幂等性

    转载请注明出处:https://www.cnblogs.com/jajian/p/10926681.html

    业务场景

    公司有个借贷的项目,具体业务类似于阿里的蚂蚁借呗,用户在平台上借款,然后规定一个到期时间,在该时间内用户需将借款还清并收取一定的手续费,如果规定时间逾期未还上,则会产生滞纳金。

    用户发起借款因此会产生一笔借款订单,用户可通过支付宝或在系统中绑定银行卡到期自动扣款等方式进行还款。还款流程都走支付系统,因此用户还款是否逾期以及逾期天数、逾期费等都通过系统来计算。
    在这里插入图片描述

    但是在做订单系统的时候,遇到这样一个业务场景,由于业务原因允许用户通过线下支付宝还款,即我们提供一个公司官方的支付宝二维码,用户扫码还款,然后财务不定期的去拉取该支付宝账户下的还款清单并生成规范化的Excel表格录入到支付系统。

    支付系统将这些支付信息生成对应的支付订单并落库,同时针对每笔还款记录生产一个消息信息到消息系统,消息的消费者就是订单系统。订单系统接受到消息后去结算当前用户的金额清算:先还本金,本金还清再还滞纳金,都还清则该笔订单结清并提升可借贷额度,……,整个流程大致如下:

    在这里插入图片描述

    从上面的流程描述可以知道,相当于原来线上的支付现在转移到线下进行,这会产生一个问题:支付结算的不及时。例如用户的订单在今天19-05-27到期,但是用户在19-05-26还清,财务在19-05-27甚至更晚的时候从支付宝拉取清单录入支付系统。这样就造成了实际上用户是未逾期还清借款而我们这边却记录的是用户未还清且产生了滞纳金。

    当然以上的是业务范畴的问题,我们今天要说的是支付系统发送消息到订单系统的环节中的一个问题。大家都知道为了避免消息丢失或者订单系统处理异常或者网络问题等问题,我们设计消息系统的时候都需要考虑消息持久化和消息的失败重试机制。

    对于重试机制,假如订单系统消费了消息,但是由于网络等问题消息系统未收到反馈是否已成功处理。这时消息系统会根据配置的规则隔段时间就 retry 一次。你 retry 一次没错,是为了保证系统的处理正常性,但是如果这时网络恢复正常,我第一次收到的消息成功处理了,这时我又收到了一条消息,如果没有做一些防护措施,会产生如下情况:用户付款一次但是订单系统计算了两次,这样会造成财务账单异常对不上账的情况发生。那就可能用户笑呵呵老板哭兮兮了。

    接口幂等性

    为了防止上述情况的发生,我们需要提供一个防护措施,对于同一笔支付信息如果我其中某一次处理成功了,我虽然又接收到了消息,但是这时我不处理了,即保证接口的 幂等性。

    维基百科上的定义:
    
    幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。
    
    在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。例如,“setTrue()”函数就是一个幂等函数,无论多次执行,其结果都是一样的,更复杂的操作幂等保证是利用唯一交易号(流水号)实现.
    

    任意多次执行所产生的影响均与一次执行的影响相同,这是幂等性的核心特点。其实在我们编程中主要操作就是CURD,其中读取(Retrieve)操作和删除(Delete)操作是天然幂等的,受影响的就是创建(Create)、更新(Update)。

    对于业务中需要考虑幂等性的地方一般都是接口的重复请求,重复请求是指同一个请求因为某些原因被多次提交。导致这个情况会有几种场景:

    前端重复提交:提交订单,用户快速重复点击多次,造成后端生成多个内容重复的订单。
    接口超时重试:对于给第三方调用的接口,为了防止网络抖动或其他原因造成请求丢失,这样的接口一般都会设计成超时重试多次。
    消息重复消费:MQ消息中间件,消息重复消费。
    

    对于一些业务场景影响比较大的,接口的幂等性是个必须要考虑的问题,例如金钱的交易方面的接口。否则一个错误的、考虑不周的接口可能会给公司带来巨额的金钱损失,那么背锅的肯定是程序员自己了。

    幂等性实现方式

    对于和web端交互的接口,我们可以在前端拦截一部分,例如防止表单重复提交,按钮置灰、隐藏、不可点击等方式。

    但是前端做控制实际效益不是很高,懂点技术的都会模拟请求调用你的服务,所以安全的策略还是需要从后端的接口层来做。

    那么后端要实现分布式接口的幂等性有哪些策略方式呢?主要可以从以下几个方面来考虑实现:

    一、Token机制

    针对前端重复连续多次点击的情况,例如用户购物提交订单,提交订单的接口就可以通过 Token 的机制实现防止重复提交。

    主要流程就是:

    服务端提供了发送token的接口。我们在分析业务的时候,哪些业务是存在幂等问题的,就必须在执行业务前,先去获取token,服务器会把token保存到redis中。(微服务肯定是分布式了,如果单机就适用jvm缓存)。
    然后调用业务接口请求时,把token携带过去,一般放在请求头部。
    服务器判断token是否存在redis中,存在表示第一次请求,这时把redis中的token删除,继续执行业务。
    如果判断token不存在redis中,就表示是重复操作,直接返回重复标记给client,这样就保证了业务代码,不被重复执行。
    
    二、数据库去重表

    往去重表里插入数据的时候,利用数据库的唯一索引特性,保证唯一的逻辑。唯一序列号可以是一个字段,例如订单的订单号,也可以是多字段的唯一性组合。例如设计如下的数据库表。

    CREATE TABLE `t_idempotent` (
      `id` int(11) NOT NULL COMMENT 'ID',
      `serial_no` varchar(255)  NOT NULL COMMENT '唯一序列号',
      `source_type` varchar(255)  NOT NULL COMMENT '资源类型',
      `status` int(4) DEFAULT NULL COMMENT '状态',
      `remark` varchar(255)  NOT NULL COMMENT '备注',
      `create_by` bigint(20) DEFAULT NULL COMMENT '创建人',
      `create_time` datetime DEFAULT NULL COMMENT '创建时间',
      `modify_by` bigint(20) DEFAULT NULL COMMENT '修改人',
      `modify_time` datetime DEFAULT NULL COMMENT '修改时间',
      PRIMARY KEY (`id`)
      UNIQUE KEY `key_s` (`serial_no`,`source_type`, `remark`)  COMMENT '保证业务唯一性'
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='幂等性校验表';
    

    我们注意看如下这几个关键性字段,

    serial_no:唯一序列号的值,在这里我设置的是通过注解@IdempotentKey来标识请求对象中的字段,通过对他们 MD5 加密获取对应的值。
    source_type:业务类型,区分不同的业务,订单,支付等。
    remark:是由标识字段的拼接成的字符串,拼接符为 “|”。
    

    由于数据建立了 serial_no,source_type, remark 三个字段组合构成的唯一索引,所以可以通过这个来去重达到接口的幂等性,具体的代码设计如下,

    public class PaymentOrderReq {
    
        /**
         * 支付宝流水号
         */
        @IdempotentKey(order=1)
        private String alipayNo;
    
        /**
         * 支付订单ID
         */
        @IdempotentKey(order=2)
        private String paymentOrderNo;
    
        /**
         * 支付金额
         */
        private Long amount;
    }
    

    因为支付宝流水号和订单号在系统中是唯一的,所以唯一序列号可由他们组合 MD5 生成,具体的生成方式如下:

    private void getIdempotentKeys(Object keySource, Idempotent idempotent) {
        TreeMap<Integer, Object> keyMap = new TreeMap<Integer, Object>();
        for (Field field : keySource.getClass().getDeclaredFields()) {
            if (field.isAnnotationPresent(IdempotentKey.class)) {
                try {
                    field.setAccessible(true);
                    keyMap.put(field.getAnnotation(IdempotentKey.class).order(),
                            field.get(keySource));
                } catch (IllegalArgumentException | IllegalAccessException e) {
                    logger.error("", e);
                    return;
                }
            }
        }
        generateIdempotentKey(idempotent, keyMap.values().toArray());
    }
    

    生成幂等Key,如果有多个key可以通过分隔符 “|” 连接,

    private void generateIdempotentKey(Idempotent idempotent, Object... keyObj) {
         if (keyObj.length == 0) {
             logger.info("idempotentkey is empty,{}", keyObj);
             return;
         }
         StringBuilder serialNo= new StringBuilder();
         for (Object key : keyObj) {
             serialNo.append(key.toString()).append("|");
         }
         idempotent.setRemark(serialNo.toString());
         idempotent.setSerialNo(md5(serialNo));
     }
    

    一切准备就绪,则可对外提供幂等性校验的接口方法,接口方法为:

    public <T> void idempotentCheck(IdempotentTypeEnum idempotentType, T keyObj) throws IdempotentException {
        Idempotent idempotent = new Idempotent();
        getIdempotentKeys(keyObj, idempotent );
        if (StringUtils.isBlank(idempotent.getSerialNo())) {
            throw new ServiceException("fail to get idempotentkey");
        }
        idempotentEvent.setSourceType(idempotentType.name());
        try {
            idempotentMapper.saveIdempotent(idempotent);
        } catch (DuplicateKeyException e) {
            logger.error("idempotent check fail", e);
            throw new IdempotentException(idempotent);
        }
    }
    

    当然这个接口的方法具体在项目中合理的使用就看项目要求了,可以通过@Autowire注解注入到需要使用的地方,但是缺点就是每个地方都需要调用。我个人推荐的是自定义一个注解,在需要幂等性保证的接口上加上该注解,然后通过拦截器方法拦截使用。这样简单便不会造成代码侵入和污染。

    另外,使用数据库防重表的方式它有个严重的缺点,那就是系统容错性不高,如果幂等表所在的数据库连接异常或所在的服务器异常,则会导致整个系统幂等性校验出问题。如果做数据库备份来防止这种情况,又需要额外忙碌一通了啊。

    三、Redis实现

    上面介绍过防重表的设计方式和伪代码,也说过它的一个很明显的缺点。所以我们另外介绍一个Redis的实现方式。

    Redis实现的方式就是将唯一序列号作为Key,唯一序列号的生成方式和上面介绍的防重表的一样,value可以是你想填的任何信息。唯一序列号也可以是一个字段,例如订单的订单号,也可以是多字段的唯一性组合。当然这里需要设置一个 key 的过期时间,否则 Redis 中会存在过多的 key。具体校验流程如下图所示,实现代码也很简单这里就不写了。

    由于企业如果考虑在项目中使用 Redis,因为大部分会拿它作为缓存来使用,那么一般都会是集群的方式出现,至少肯定也会部署两台Redis服务器。所以我们使用Redis来实现接口的幂等性是最适合不过的了。
    状态机

    对于很多业务是有一个业务流转状态的,每个状态都有前置状态和后置状态,以及最后的结束状态。例如流程的待审批,审批中,驳回,重新发起,审批通过,审批拒绝。订单的待提交,待支付,已支付,取消。

    以订单为例,已支付的状态的前置状态只能是待支付,而取消状态的前置状态只能是待支付,通过这种状态机的流转我们就可以控制请求的幂等。

    public enum OrderStatusEnum {
    
        UN_SUBMIT(0, 0, "待提交"),
        UN_PADING(0, 1, "待支付"),
        PAYED(1, 2, "已支付待发货"),
        DELIVERING(2, 3, "已发货"),
        COMPLETE(3, 4, "已完成"),
        CANCEL(0, 5, "已取消"),
        ;
    
        //前置状态
        private int preStatus;
    
        //状态值
        private int status;
    
        //状态描述
        private String desc;
    
        OrderStatusEnum(int preStatus, int status, String desc) {
            this.preStatus = preStatus;
            this.status = status;
            this.desc = desc;
        }
    
        //...
    }
    

    假设当前状态是已支付,这时候如果支付接口又接收到了支付请求,则会抛异常或拒绝此次处理。

    展开全文
  • 系统接口规范以及常见的接口技术概述和比较   一、基本要求: 为了保证系统的完整性和健壮性,系统接口应满足下列基本要求: 1、接口应实现对外部系统的接入提供企业级的支持,在系统的高并发和大容量...

    系统接口规范以及常见的接口技术概述和比较

     

    一、基本要求:
    为了保证系统的完整性和健壮性,系统接口应满足下列基本要求:
    1、接口应实现对外部系统的接入提供企业级的支持,在系统的高并发和大容量的基础上提供安全可靠的接入;
    2、提供完善的信息安全机制,以实现对信息的全面保护,保证系统的正常运行,应防止大量访问,以及大量占用资源的情况发生,保证系统的健壮性;
    3、提供有效的系统的可监控机制,使得接口的运行情况可监控,便于及时发现错误及排除故障;
    4、保证在充分利用系统资源的前提下,实现系统平滑的移植和扩展,同时在系统并发增加时提供系统资源的动态扩展,以保证系统的稳定性;
    5、在进行扩容、新业务扩展时,应能提供快速、方便和准确的实现方式。

    二、接口通讯方式:
    接口基本采用了同步请求/应答方式、异步请求/应答方式、会话方式、广播通知方式、事件订阅方式、可靠消息传输方式、文件传输等通讯方式:
    1、同步请求/应答方式:客户端向服务器端发送服务请求,客户端阻塞等待服务器端返回处理结果;
    2、异步请求/应答方式:客户端向服务器端发送服务请求,与同步方式不同的是,在此方式下,服务器端处理请求时,客户端继续运行;当服务器端处理结束时返回处理结果;
    3、会话方式:客户端与服务器端建立连接后,可以多次发送或接收数据,同时存储信息的上下文关系;
    4、广播通知方式:由服务器端主动向客户端以单个或批量方式发出未经客户端请求的广播或通知消息,客户端可在适当的时候检查是否收到消息并定义收到消息后所采取的动作;
    5、事件订阅方式:客户端可事先向服务器端订阅自定义的事件,当这些事件发生时,服务器端通知客户端事件发生,客户端可采取相应处理。事件订阅方式使客户端拥有了个性化的事件触发功能,极大方便了客户端及时响应所订阅的事件;
    6、文件传输:客户端和服务器端通过文件的方式来传输消息,并采取相应处理;
    7、可靠消息传输:在接口通讯中,基于消息的传输处理方式,除了可采用以上几种通讯方式外,还可采用可靠消息传输方式,即通过存储队列方式,客户端和服务器端来传输消息,采取相应处理。

    三、接口安全要求:
    为了保证系统的安全运行,各种接口方式都应该保证其接入的安全性。
    接口的安全是系统安全的一个重要组成部分。保证接口的自身安全,通过接口实现技术上的安全控制,做到对安全事件的“可知、可控、可预测”,是实现系统安全的一个重要基础。
    根据接口连接特点与业务特色,制定专门的安全技术实施策略,保证接口的数据传输和数据处理的安全性。
    系统应在接入点的网络边界实施接口安全控制。
    接口的安全控制在逻辑上包括:安全评估、访问控制、入侵检测、口令认证、安全审计、防恶意代码、加密等内容。

    四、传输控制要求:
    传输控制利用高速数据通道技术实现把前端的大数据量并发请求分发到后端,从而保证应用系统在大量客户端同时请求服务时,能够保持快速、稳定的工作状态。
    系统应采用传输控制手段降低接口网络负担,提高接口吞吐能力,保证系统的整体处理能力。具体手段包括负载均衡、伸缩性与动态配置管理、网络调度等功能:
    1、负载均衡:为了确保接口服务吞吐量最大,接口应自动地在系统中完成动态负载均衡调度;
    2、伸缩性与动态配置管理:由系统自动伸缩管理方式或动态配置管理方式实现队列管理、存取资源管理,以及接口应用的恢复处理等;
    3、网络调度:在双方接口之间设置多个网络通道,实现接口的多数据通道和容错性,保证当有一网络通道通讯失败时,进行自动的切换,实现接口连接的自动恢复。

    五、接口技术:
    5.1 J2EE/EJB
    5.1.1. 技术描述
    Enterprise JavaBean (EJB) 是可重用的、可移植的 J2EE 组件。EJB 包括三种主要类型:会话 bean、实体 bean和消息驱动的bean。会话bean执行独立的、解除耦合的任务,譬如检查客户的信用记录。实体bean是一个复杂的业务实体,它代表数据库中存在的业务对象。消息驱动的bean用于接收异步JMS 消息。

    图 5.1.1 J2EE/EJB 描述
    EJB 由封装业务逻辑的方法组成,众多远程和本地客户端可以调用这些方法。另外,EJB 在容器里运行,这样开发人员只要关注bean里面的业务逻辑,不必担心复杂、容易出错的问题,譬如事务支持、安全性和远程对象访问、高速缓存和并发等。在EJB规范中,这些特性和功能由EJB容器负责实现。
    容器和服务提供者实现了EJB的基础构造,这些基础构造处理了EJB的分布式、事务管理、安全性等内容。EJB规范定义了基础构造和Java API的为了适应各种情况的要求,而没有指定具体实现的技术、平台、协议。
    EJB的上层的分布式应用程序是基于对象组件模型的,低层的事务服务用了API技术。EJB技术简化了用JAVA语言编写的企业应用系统的开发、配置和执行。

    5.1.2. 技术特点
    优点:基于规范的平台,不受限于特定的操作系统或硬件平台;基于组件体系结构,简化了复杂组件的开发;提供对事务安全性以及持续性的支持;支持多种中间件技术。
    缺点:与特定于某个操作系统或平台的实现技术相比,性能还有待进一步提高,且资源占用量较大。

    5.2 Web Service
    5.2.1. 技术描述
    Web Service是一种自包含、模块化的应用,是基于网络的、分布式的模块化组件,它执行特定的任务,遵守具体的技术规范,这些规范使Web Service能与其它兼容的组件进行互操作。可以在网络上(一般是Internet)上被描述、发布、定位和调用。
    Web Service体系主要由以下三部分组成:传输协议、服务描述和服务发现,由一系列标准组成,主要有:XML(可扩展的标记语言)、SOAP(简单对象访问协议)等。

    图 5.2.1 Web Service描述
    上图显示了Web Service(中央)、客户端软件应用程序(左侧)及其使用的资源(包括数据库、其它Web Service等)(右侧)之间的关系。Web Service通过使用标准协议(如 HTTP)交换XML消息来与客户端和各种资源进行通信。在Web Server上部署Web Service后,由Web Server负责将传入的XML消息路由到Web Service。Web Service 将导出 WSDL 文件,以描述其接口,其它开发人员可以使用此文件来编写访问此Web Service的组件。
    5.2.2. 技术特点
    Web Service使用标准技术,应用程序资源在各网络上均可用。因为Web Service基于HTTP 、XML和SOAP等标准协议,所以即使以不同的语言编写并且在不同的操作系统上运行,它们也可以进行通信。因此,Web Service适用于网络上不同系统的分布式应用。
    优点:适用于网络上不同系统的分布式应用、标准性好、扩展性好、耦合度低;内容由标准文本组成,任何平台和程序语言都可以使用;格式的转换基本不受限制,可以满足不同应用系统的需求。
    缺点:当XML内容较大时,解释程序的执行效率较低,一般不适合用于实现大批量数据交互的接口。

    5.2 交易中间件
    5.3.1. 技术描述
    交易中间件是专门针对联机交易处理系统而设计的。联机交易处理系统需要处理大量并发进程,涉及到操作系统、文件系统、编程语言、数据通讯、数据库系统、系统管理、应用软件等多个环节,采用交易中间件技术可以简化操作。
    交易中间件是一组程序模块,用以减少开发联机交易处理系统所需的编程量。X/OPEN组织专门定义了分布式交易处理的标准及参考模型,把一个联机交易系统划分成资源管理(RM)、交易管理(TM)和应用(AP)三部分,并定义了应用程序、交易管理器、多个资源管理器是如何协同工作的。资源管理器是指数据库和文件系统,交易管理器可归入交易中间件。
    5.3.2. 技术特点
    优点:开放的体系结构,满足大用户量与实时性的要求,提供交易的完整性、控制并发、交易路由和均衡负载的管理。
    缺点:处理大数据量交易效率不高。

    5.4. 消息中间件
    5.4.1. 技术描述
    基于消息中间件的接口机制主要通过消息传递来完成系统之间的协作和通信。
    通过消息中间件把应用扩展到不同的操作系统和不同的网络环境。通过使用可靠的消息队列,提供支持消息传递所需的目录、安全和管理服务。当一个事件发生时,消息中间件通知服务方应该进行何种操作。其核心安装在需要进行消息传递的系统上,在它们之间建立逻辑通道,由消息中间件实现消息发送。消息中间件可以支持同步方式和异步方式,实际上是一种点到点的机制,因而可以很好的适用于面向对象的编程方式。
    消息中间件可以保证消息包传输过程的正确、可靠和及时。
    消息中间件提供以下基本功能:消息队列、触发器、信息传递、数据格式翻译、安全性控制、数据广播、错误恢复、资源定位、消息及请求的优先级设定、扩展的调试功能等。
    5.4.2. 技术特点
    消息中间件能够在任何时刻将消息进行传送或者存储转发,不会占用大量的网络带宽,可以跟踪事务,并且通过将事务存储到磁盘上实现网络故障时系统的恢复。
    优点:为不同的企业应用系统提供了跨多平台的消息传输;除支持同步传输模式外,还支持异步传输,有助于在应用间可靠地进行消息传输。
    缺点:与其它中间件技术一样,存在高流量的性能瓶颈问题。
    5.5. SOCKET
    5.5.1. 技术描述
    Socket(套接字)用于描述IP地址和端口。应用程序通过Socket向网络发出请求或应答网络请求。
    Socket使用客户/服务器模式,服务端有一个进程(或多个进程)在指定的端口等待客户来连接,服务程序等待客户的连接信息,一旦连接上之后,就可以按设计的数据交换方法和格式进行数据传输。客户端在需要的时刻发出向服务端的连接请求,然后发送服务申请消息包,服务端向客户端返回业务接口服务处理结果消息包。
    5.5.2. 技术特点
    此类接口不需要其它软件支持,只要接口双方做好相关约定(包括IP地址、端口号、包的格式)即可;包的格式没有统一标准,可以随意定义。
    优点:实现简单、性能高。
    缺点:标准性差、扩展性差。
    5.6. CORBA
    5.6.1. 技术描述
    CORBA即公共对象请求代理体系结构,是一个具有互操作性和可移植性的分布式面向对象的应用标准。
    CORBA标准主要分为3个层次:对象请求代理、公共对象服务和公共设施。最底层是ORB(对象请求代理),规定了分布对象的定义(接口)和语言映射,实现对象间的通讯和互操作,是分布对象系统中的“软总线”;在 ORB之上定义了很多公共服务,可以提供诸如并发服务、名字服务、事务(交易)服务、安全服务等各种各样的服务, 同时ORB也负责寻找适于完成这一工作的对象,并在服务器对象完成后返回结果;最上层的公共设施则定义了组件框架,提供可直接为业务对象使用的服务,规定业务对象有效协作所需的协定规则。
    客户将需要完成的工作交给ORB,由ORB决定由哪一个对象实例完成这个请求,然后激活这个对象,将完成请求所需要的参数传送给这个激活的对象。除了客户传送参数的接口外,客户不需要了解其它任何信息,不必关心服务器对象的与服务无关的接口信息,这就大大简化了客户程序的工作。ORB需要提供在不同机器间应用程序间的通信,数据转换,并提供多对象系统的无缝连接。
    5.6.2. 技术特点
    CORBA具有模型完整,独立于系统平台和开发语言,被支持程度广泛的特点。
    优点:以一种中间件的方式为不同编程语言提供协同工作的可能;对操作系统没有特殊的要求和依赖;与主流的体系架构(如J2EE)关系密切。当需要集成的两个企业应用软件互为异构,由不同的编程语言实现时(如Java与C++),CORBA可以实现两种语言的协同工作。
    缺点:庞大而复杂,并且技术和标准的更新相对较慢;性能与具体业务实现有关。
    5.7. 文件
    5.7.1. 技术描述
    文件接口定义了服务端与客户端文件存放路径、文件名命名规则和文件格式,并开放相应的读/写操作权限。
    接口的通讯过程包括三种:
     同一主机内可以共享一个路径;
    服务器端向客户端开放路径,客户端定时查看此路径下是否有新的文件,可以采用FTP等方式取走服务端开放的路径下的文件;
    客户端向服务器端开放路径,由服务端将文件写入,客户端定时查看此路径下是否有新的文件。
    网络传输方式应支持对通信机的IP地址、帐户、口令、存取目录的验证。
    接口应支持以下主流网络协议:FTP、FTAM等。
    数据传输应支持:
     实时、高效和安全可靠地传送批量数据;
     断点续传功能;
     数据压缩传输;
     传输过程中的差错控制。
    5.7.2. 技术特点
    优点:文件接口不需要其它软件支持,只要接口双方约定好路径、格式、处理方式即可,实现简单、传输批量数据效率较高。
    缺点:格式没有统一标准,标准性差;需要开放文件系统权限,安全性差。
    5.8. 过程调用和共享数据表
    5.8.1. 技术描述
    过程调用和共享数据表技术实现了服务端向客户端开放可直接调用的过程和可直接进行读写操作的共享数据表,客户端直接调用服务端过程和对共享数据表进行读写操作。
    接口支持各种数据库连接方式,如Login、DB Link等。
    接口的通讯过程包括两种:
    客户端直接调用服务端开放的过程或对服务端开放的共享数据表进行增、删、改和查询操作,完成业务处理;
    客户端向开放的共享数据表中写入服务请求数据,服务端定时扫描共享数据表并作出响应,根据服务请求数据中的接口服务类型代码,进行不同的业务逻辑处理,然后向共享数据表中写入处理结果数据;客户端定时扫描共享数据表,根据处理结果数据并作出响应,进行业务后续处理。
    5.8.2. 技术特点
    此类接口不需要其它软件支持,只要接口双方做好相关约定即可;但接口没有统一标准,而且需要开放数据库权限,安全性差。
    优点:实现简单、传输批量数据效率较高。
    缺点:标准性差、适用场合有限、安全性差。

    六、接口技术比较
    接口技术 主要优点 主要缺点 对接口类型适用程度
    同步 异步 批量 频繁
    J2EE/EJB 开放标准
    跨平台
    提供事务、
    安全性的支持 性能一般
    资源占用多 ★★★ ★★★ ★★ ★★★
    Web Service 标准性好
    扩展性好
    耦合度低 性能一般 ★★★ ★★ ★ ★★
    交易中间件 开放的体系结构
    提供事务、
    安全性的支持
    提供队列的管理
    支持并发管理 大数据量交易
    效率不高 ★★★ ★★★ ★ ★★★
    消息中间件 开放的体系结构
    满足大用户量与实时性的要求
    支持并发管理 大数据量交易
    效率不高 ★★ ★★★ ★★★ ★★
    SOCKET 实现简单
    性能高 标准性差
    扩展性差 ★★ ★★ ★★ ★★
    CORBA 开放标准
    跨语言
    跨平台 开发复杂
    产品成熟度低
    性能一般 ★★★ ★★ ★★ ★★★
    文件 实现简单
    传输批量数据
    效率较高 标准性差
    安全性差 ★ ★★ ★★★ ★
    过程调用
    和共享表 实现简单
    传输批量数据
    效率较高 标准性差
    安全性差
    适用场合有限 ★ ★★ ★★★ ★★

    展开全文
  • Posix标准系统接口总览

    千次阅读 2020-02-20 19:58:23
    Posix标准系统接口总览 (Portable Operating System Interface)中文:可移植操作系统接口,X则表明其对Unix API的传承,作为本系列博文的开篇,主要介绍在我们实际开发过程中应用到的POSIX系列接口,主要涉及多线程...

    Posix标准系统接口总览

    (Portable Operating System Interface)中文:可移植操作系统接口,X则表明其对Unix API的传承,作为本系列博文的开篇,主要介绍在我们实际开发过程中应用到的POSIX系列接口,主要涉及多线程、实时性等方面,开发平台主要涉及Linux Vxworks ,介绍POSIX标准在两种平台下的实现差异,详细内容见下图:
    Posix

    展开全文
  • 操作系统接口

    千次阅读 2020-04-14 17:06:39
    应用软件需要通过接口来接触到操作系统,即上层应用是通过什么方式进入到操作系统的。 在linux系统中,程序执行到最后就会执行一个shell程序,该程序的作用是打印当我们输入一个命令,比如./output "hello"的...

    操作系统全部笔记目录见操作系统笔记整理

    我们之前的bootset程序和setup的主要作用就是让内存布局像上图这么安排。应用软件需要通过接口来接触到操作系统,即上层应用是通过什么方式进入到操作系统的。

    在linux系统中,程序执行到最后就会执行一个shell程序,该程序的作用是打印当我们输入一个命令,比如./output "hello"的时候,它就去执行相关的操作。所谓命令,就是一段程序

    应用程序通过函数GetMessage,把消息从内核中消息队列里一个一个拿出来,然后根据拿出来的消息来执行相应的功能。即一个循环调用一个函数,来循环处理消息。

    应用程序进入操作系统,操作系统接口表现为系统调用

    如果系统满足如上系统调用,软件移植就会很方便,因为系统调用函数是一样的。

    展开全文
  • 4.系统接口——操作系统接口

    千次阅读 2017-01-12 14:21:29
    Interface:electrical circuit linking one device with another and enabling data ...用户是怎么用操作系统的?1.1 命令行命令是用C语言写的程序,程序编译完,会编译处 可执行文件,比如可执行文件是output,she
  • 分布式系统接口幂等性

    千次阅读 2018-08-17 10:56:58
    1.幂等性定义 1.1 数学定义 ... 2.... 2.2 实际业务 ...分布式系统接口幂等性 References 1.幂等性定义 1.1 数学定义 在数学里,幂等有两种主要的定义: 在某二元运算下,幂...
  • 操作系统复习——操作系统接口

    千次阅读 2018-06-08 14:19:11
    1:操作系统为了方便用户方便的使用向用户提供了两类接口:用户接口(联机用户接口与脱机用户接口)和程序接口2:程序接口是OS专门为用户程序设置的,它是用户程序取得OS服务的唯一接口。3:系统调用提供了用户程序...
  • Spring Boot实现跨系统接口调用

    千次阅读 2019-09-09 13:46:39
    Spring Boot实现跨系统接口调用一、概述1、使用httpClient请求2、使用RestTemplate方法3、使用Fegin进行消费插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右...
  • SAP系统接口方式:

    万次阅读 2018-08-10 08:55:02
      1.PI - 信使中间件 (大公司多选择) 数据: SAP- PI- U8 U8- PI- SAP PI 底层用的还是webservice 技术 优点:实时性高; 可处理大数据(在调用... 有接口数据日志在PI系统; 缺点:PI 服务器+1; PI系统配...
  • 导读: ... 大家可以关注我个人公众号,所有分享内容,会在公众号第一时间推送,且阅读排版更好。 愿大家的学习,轻松且愉快。 如果大家觉得有用,希望...其中,我们提到:如果其他外部公司要与自己企业内部的系统有...
  • 系统接口框架设计与实现

    千次阅读 2019-07-16 14:28:28
    目录 1 引言 2 设计 2.1 InterFace 2.2 Business Service 2.3 Object Transaction Data 3 实现 3.1 WebService.asmx 3.2IBusinessService 3.3 Common (SubmitResult) ...4.2 接口服务配置 4.3 调用...
  • 分布式系统接口幂等性设计

    万次阅读 2017-09-25 15:35:50
    接口幂等分布式系统中,接口幂等性是系统可行性论证的第一个步骤。 一个软件系统中,所有的接口都可以归结为增删改查四大类;下面我们对这四大类接口进行分析;查询和删除 查询操作 查询一次和查询多次,在数据...
  • ajax调用别的系统接口

    千次阅读 2019-07-03 16:14:09
    $.ajax({ type: 'POST', url: 'http://n.fuqing*****外部接口地址*****/list', dataType: 'json', contentType: 'application/json', data: JSON.stringi...
  • 第—条 《远程医疗咨询系统接口功能规范》是指医院信息系统与远程医疗咨询系统本地端的接口程序。其主要任务是保证远程医疗咨询系统所需的信息能及时、迅速的从医院信息系统中直接产生并读取,最大限度的避免信息的...
  • 外部系统接口请求几种方法

    千次阅读 2019-08-20 16:58:32
    https://blog.csdn.net/u014231646/article/details/95641173
  • 作为一名P2P和小贷行业的产品经理,经常有外部系统进行接口对接的需求。P2P系统需要对接的外部系统主要有P2P返利网这些聚合型的理财平台,第三方支付平台,P2P行业信息门户网站等。而小贷业务系统主要对接的有P2P...
  • 软硬件或其他外部系统接口需求

    千次阅读 2018-12-27 13:11:00
    系统的总体结构采用菜单调用窗体,利用窗体来对信息进行管理、数据加工、信息。 界面菜单:需要统一的菜单风格,包括菜单图片、颜色,菜单栏目的划分,各种功能的菜单标题等。 操作方式:鼠标操作加键盘操作 色彩...
  • java实现跨系统接口调用简单

    万次阅读 2017-11-14 11:26:12
    接口调用代码 CommonsProperty commonsProperty=(CommonsProperty)SpringUtils.getBean("commonsProperty"); HttpPost httpRequst = new HttpPost(commonsProperty.getUriAPI());// 创建HttpPost对象 ...
  • 异步系统接口调用流程图

    千次阅读 2016-03-10 16:05:00
    ................................... 大小: 13.6 KB 大小: 32.8 KB
  • void release_firmware(const struct firmware *fw);
  • 系统调用接口

    千次阅读 2018-11-27 09:53:59
    因此,由操作系统内核提供一系列内核函数,通过一组称为系统调用的接口提供给用户使用。系统调用的作用是把应用程序的请求传递给系统内核,然后调用相应的内核函数完成所需的处理,最终将处理结果返回给应用程序。...
  • 导读: ... 大家可以关注我个人公众号,所有分享内容,会在公众号第一时间推送,且阅读排版更好。...所谓系统接口,实际上就是不同系统间的数据交换方式。 对于一个企业来说,肯定不是一个系统就能够支持所有业务...
  • 接口测试工具Postman接口测试图文教程

    万次阅读 多人点赞 2018-07-11 13:10:03
    市场上有很多优秀的,完善的接口测试工具,比如SoapUI,Postman等,能够高效的帮助后端开发人员独立进行接口测试。这里使用Postman接口测试工具,此处以请求方式为POST的userLogin登录接口为例。
  • 系统接口设计

    万次阅读 2015-06-23 12:31:22
    最近两年一直在和银行、公安、保险、民政等第三方单位之间做接口,写的接口文档不下30份,最初的接口文档漏洞百出,改了又改,丢了不少人,也被批评、埋怨,指责了很多次,久而久之,明白了一个最重要的道理,协作...
  • 分布式系统接口幂等性设计

    万次阅读 2020-08-16 02:26:47
    分布式系统接口幂等性设计 在微服务架构下,我们在完成一个订单流程时经常遇到下面的场景: 一个订单创建接口,第一次调用超时了,然后调用方重试了一次 在订单创建时,我们需要去扣减库存,这时接口发生了...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,323,897
精华内容 929,558
关键字:

系统接口