C_Meng PSNA

Never wait for the storm to pass, just dance in the rain.

0%

1、知识图谱系统的关键特性有哪些?

1.当然是可视化展示,知识图谱的魅力之一就是让人直观的看到多实体之间的关系,能用图标示的就不要哔哔

2.多种服务提供方式,有些服务使用方,不需要图,那么可能通过api或者批量文件的方式比较合适。所以从系统建设角度来看,最好能提供多样的服务对接方式,满足前端服务使用方的不同需要,发挥系统价值,是值得考虑的地方。

3.查询速度,在用户进行图操作,例如实体查询、关系推演扩展时,系统响应时间应该较低,避免大并发情况下用户体验的降低。

数据建模、批量时间相对来说,外界感知不到,因此不那么重要。

2、知识图谱适用场景有哪些?

主要涉及关系分析的场景,利用账户、自然人或者资金交易形成的关系来判定结果是否可用时,比如担保圈、分析实际控制人、实际受益人、识别冒名贷款。而且通常,数据分析的深度在3度到5度,才能体现出优势。

分析深度小于3度,与传统关系型数据库没有太大差别,大于5度有可能引入较多的噪音数据。当然不排除某些场景下分析5度以上数据的可能性。

3、有没有业务场景是只能用知识图谱实现的?而其他技术方法无法实现?

从技术角度考虑,应该没有,有的是效率孰高孰低、开发成本孰高孰低。

4、知识图谱应用时会面临哪些主要的困难,如何解决?

主要是确认需求,一方面是适不适合用知识图谱这个工具,另一方面做好与其他系统的对接工作,如何能将知识图谱这个服务以简便快捷的方式输出给其他系统。前者可以和多方面行内外专家交流,后者主要还是要与业务部门进行沟通,确认业务部门的期望,技术实现大多时候不是难点,难的是如何满足欲壑难填的需求。

5、知识图谱系统的建设核心是什么?该如何选型?

建设核心是图数据的存储和分析方法。不同的核心,外围使用的方法也不同。

以titan为例,它是集成在hadoop上的。数据的分析加工主要在使用sparksql和graphx,结果会存放在titan中,数量较多的明细流水会放在hbase中,常用的查询关键字,姓名、手机号码等会放在elasticsearch中,三者通过key相互关联。

如果换一种图数据库,比如neo4j,整个外围都会跟着调整。所以图数据库的选型不能进场图数据本身考虑,而应该结合整体规划,建设成本,多系统间的关联关系层面进行统筹考虑,甚至可能会为了大局牺牲一些效率。

6、图形数据库应该怎么选型?选的时候需要考虑哪些问题?

从系统自身考虑的话,包括高可靠性,读写效率、扩展性,与其他系统相同。

除此之外,还应该从整体规划和这个系统所处的位置进行考虑,为了满足整体规划,牺牲一些性能或者成本也是必要的。比如为了避免海量数据的多系统存储分析,就选用了以hadoop为基础的图数据库,这样所有的数据只需一份,可以供平台上的多个子系统进行使用。

7、为满足关键特性系统的架构或组件选择是怎样的?(主要针对hadoop架构)

1.可视化需要开发一个专门的知识图谱展示界面,将知识图谱中的实体、关系属性等以美观已操作的方式展示出来,因为颜值即正义。可以借用当前比较流行的bootstrap等前端开发语言。

2.为满足快速查询,可以将部分索引关键字放在索引es中,索引命中后在使用key去titian中查询。

3.多种服务方式,需要从设计时就进行考虑,至少满足三种api、可视化界面、批量文件。批量文件主要从hive中进行导出,而api接口则需要开发一个服务层,将所有图数据库的命令行操作转换为对应的api接口,轻量级的开发一个java服务放在tomcat中,有条件的可以使用微服务框架。

8、知识图谱的建设都有哪些重要的环节,需要注意什么?

从自身项目实施来看,有三个地方:

1.建模时多系统数据的融合,比如客户的信息存在多个系统中,核心、信贷、理财等,因为系统建设时间不一、多次升级等问题,导致数据不一致,数据质量较差,这样就需要花费很大精力去处理数据质量问题,还可能导致程序返工。

2.模型开发过中,选择哪些业务场景也很重要,知识图谱不是万金油,有些场景比较费力。应该选择那些跟关联关系分析相关的,有明确结果,业务人员能够明确正确与否的应用场景,便于展示这个工具的优越性。

3.交付前的测试也很重要。因为知识图谱基本上都是需要融合各个业务系统的数据,涉及面较广。因此要给测试过程留够时间,便于测试人员发现一些数据处理上的遗漏。

9、知识图谱与智能客服如何对接?

主要是通过API接口,在接入的同时系统自动调出客户当前的资产负债状况,最近的交易明细,购买产品的状况。在提问的时候,通过nlp系统解析问题中的关键字,识别询问的实体、关系等,找到关联的问题,引导客户按照提问已有的问题。使用知识图谱的好处在于,可以快速的查询出客户周边的所有数据。如果使用传统关系型数据库,则需要按照业务种类,逐个表进行查询,分模块展示。在图谱中则可以一起展示出来,因为是从客户出发按照关联关系进行查询的,并且可以用一张图进行直观的展示。

10、部署时需要满足怎样的性能要求,qps或tps?如果建设面向外部客户的大规模知识图谱,有哪些可以优化的方向?

性能的需求应该是与业务场景强相关的,如果是面向外部客户那就要考虑扩容节点提升整体性能,明细数据可以从hbase迁移到es中,加快查询速度,限制部分查询内容或者只能查看经过分析的子图。

对于行内系统,从数据安全角度来看,只有少部分人能看到所有数据,绝大多数人只能看到部分数据,而且应该是具有特定业务含义的数据,比如某个预警模型的结果。在这种情况下,权限范围内的数据量就很小了,那么在查询的过程中,效率也会相应提升,不会全表扫描。

11、有没有合适的企业级的分布式知识图谱技术架构?

横向涉猎不多,答错勿怪。

titian就是分布式的,因为它是基于hbase的。

Neo4j 好像就不支持,不像hbase这么简单就可以进行扩展。

12、知识图谱存储会不会引起数据膨胀?

图数据库本身不会,但是知识图谱这个系统会,一份数据至少存在于hive加工区和hbase查询区,还有少量的elasticsearch索引区。

13、关于实体、属性、关系的识别和存储?

大多数情况下实体关系属性都是比较明确的,因为知识图谱的建模是与现实世界相符的。

比如银行来说客户就是实体,姓名,身 份 证 号码,手机号都是属性。

关系相对稍微复杂一点,不过常见的关系也都比较明确,比如客户经理和贷款户,机构和对公客户,合同和借款人等等。

银行这边的实体基本上都是自然人、账号,机构,合同、押品等,关系就是实体之间的关系,比如账号和自然人的归属关系。

实体、关系和属性都是存在titan里的,交易明细存在hbase里。

14、脏数据的处理机制是什么?

知识图谱作为下游系统其实没有好的办法处理脏数据,基本上有两种策略:

第一:确定一个优先级,某个属性以哪个系统为准,当两个系统不一致时,不管对错永远以某个系统为准。

第二:前一种方法不适用的,就将这些数据打入“冷宫”,放到一张表里,定期拿出来,找原系统进行数据修正,这是一个比较漫长的过程。

不过好在,80%以上的数据是正常的,脏数据多数由于客户长期未发生业务,渠道无法强制客户更新数据。

15、如何解决外部数据源准确性?

我个人无法从根本上解决,因为我们只是数据的使用方,准确性是需要从产生的根源上解决的问题。

不过在使用的时候可以进行多数据源的交叉验证,来提高准确性,完全消除是难以实现的。

16、用知识图谱做传统的风控行业,局限性在哪里?利用大数据挖掘,除知识图谱外,还有哪些比较好的风控模型?

1.知识图谱是一种工具,是一种与关系型数据库相对的数据组织方式,有其擅长的领域,但不能手里拿着锤子,看哪里都是钉子。知识图谱也有不擅长的领域。

2.除大数据外,基于传统的关系型数据库开发一些机器学习或深度学习模型也可以做到风控。

原文链接:
https://mp.weixin.qq.com/s/kAxnYpW16fc-JvwhAA8onA

背景

假设你在开发一个服务端应用。该应用必须支持各种各样的客户端,包括桌面浏览器、手机浏览器和本地手机应用。应用可能也需要公开部分API供第三方使用,还可能与其他应用通过web service或消息代理(message broker)相集成。应用执行业务逻辑来处理请求(HTTP请求或者消息);访问数据库;与其他系统交换消息;并返回HTML/JSON/XML类型的响应。

应用或是多层架构或是六角架构,并且包含多种类型的组件:

  • 表示组件(Presentation components) - 响应处理HTTP请求,并返回HTML或JSON/XML(对于web service API)
  • 业务逻辑(Business logic) - 应用的业务逻辑
  • 数据库访问逻辑(Database access logic) - 数据访问对象用于访问数据库
  • 应用集成逻辑(Application integration logic) - 消息层,如基于Spring的集成

这些逻辑组件分别响应应用中不同的功能模块。

问题

应用的部署架构是什么?

动机

  • 该应用由一个开发者团队在维护
  • 团队新成员必须快速上手
  • 应用应该易于理解和修改
  • 你想对应用进行持续集成
  • 你必须在多台机器上部署多份应用的拷贝,以满足可伸缩性和可用性的要求
  • 你想使用新技术(框架、编程语言等)

解决方案

通过采用伸缩立方(Scale Cube)(特别是y轴方向上的伸缩)来架构应用,将应用按功能分解为一组相互协作的服务的集合。每个服务实现一组有限并相关的功能。比如,一个应用可能包含订单管理服务,客户管理服务等。

服务间通过HTTP/REST等同步协议或AMQP等异步协议进行通讯。

服务独立开发和部署。

每个服务为了与其他服务解耦,都有自己的数据库。必要时,数据库间的一致性通过数据库复制机制或应用级事件来维护。

举例

我们假设你在构建一个电子商务应用,应用从客户接收订单,验证库存和可用额度,并派送订单。应用包含多个组件,包括StoreFrontUI,用来实现用户接口,以及一些后台服务,用于检测信用额度、维护库存和派送订单。

应用作为一组服务部署。

结果

这个方案有一些好处:

  • 每个微服务都相对较小
    • 易于开发者理解
    • IDE反应更快,开发者更高效
    • web容器启动更快,开发者更高效,并提升了部署速度
  • 每个服务都可以独立部署 - 易于频繁部署新版本的服务
  • 易于伸缩开发组织结构。你可以对多个团队的开发工作进行组织。每个(双披萨[1])团队负责单个服务。每个团队可以独立于其他团队开发、部署和伸缩服务。
  • 提升故障隔离(fault isolation)。比如,如果一个服务存在内存泄露,那么只有该服务受影响,其他服务仍然可以处理请求。相比之下,一体架构的一个出错组件可以拖垮整个系统。
  • 每个服务可以单独开发和部署
  • 消除了任何对技术栈(technologh stack)的长期投入(long-term commitments)

这个方案也有一些缺点:

  • 开发者要处理分布式系统的额外复杂度。
    • 开发者工具/IDE是面向构建一体应用的,并没有显示提供对开发分布式应用的支持
    • 测试更加困难
    • 开发者需要实现服务间通信机制
    • 不使用分布式事务实现跨服务的用例更加困难
    • 实现跨服务的用例需要团队间的细致协作
  • 生产环境的部署复杂度。对于包含多种不同服务类型的系统,部署和管理的操作复杂度仍然存在。
  • 内存消耗增加。微服务架构使用NxM个服务实例来替代N个一体应用实例。如果每个服务运行在自己独立的JVM(或类似)上,通常有必要对实例进行隔离,对这么多运行的JVN,就有M倍的开销。另外,如果每个服务运行在独立的VM(如EC2实例),如Netflix,开销会更高。

挑战

什么时候使用微服务架构

使用该方法的一个挑战就是决定何时使用才合理。在开发应用的初期,你通常不会遇到这种方法试图解决的问题。而且,使用这个精细、分布式的架构将会拖慢开发进度。对初创公司,这是个严重问题,因为它们的最大挑战通常是如何快速发展业务模型及相关应用。使用Y轴切分使快速迭代更加困难。但是之后,当挑战变成如何伸缩,你需要使用功能分解将一体应用切分为一组服务时,混乱的依赖关系可能使之变得困难。

如何拆分应用到服务

另一个挑战是如何将系统分隔为微服务。这是个技术活,但有些策略可能有帮助。

  • 按业务能力分解,定义与业务能力对应的服务。
  • 按领域驱动设计的子域分解。
  • 按动词或用例分解并定义负责特定操作的服务。例如,负责装运完整订单的运输服务。
  • 通过定义负责对给定类型的实体/资源执行所有操作的服务,按名词或资源进行分解。例如,负责管理用户帐户的帐户服务。

理论上,每个服务应该只承担很小的职责。Bob Martin(大叔)讲过使用单一职责原则(SRP)来设计类。SRP定义类的职责作为变化的原因,而且类应该只有一个变化的原因。使用SRP来设计服务也是合理的。

另一个有助于服务设计的类比是Unix实用工具的设计方法。Unix提供大量的实用工具如grep、cat和find。每个工具只做一件事,通常做得非常好,并且可以跟其他工具使用shell脚本组合来执行复杂任务。

如何保持数据一致性

为了确保松耦合,每个服务都有自己的数据库。维护服务之间的数据一致性是一个挑战,因为对于许多应用程序来说,两阶段提交/分布式事务不是一个选项。应用程序必须使用SAGA模式。服务在其数据更改时发布事件。其他服务使用该事件并更新其数据。有几种可靠更新数据和发布事件的方法,包括事件源和事务日志跟踪。

如何实现查询

另一个挑战是实现需要检索多个服务拥有的数据的查询。

API组合和命令查询责任分离(CQR)模式。

相关模式

有许多与微服务模式相关的模式。单片架构是微服务架构的替代方案。其他模式解决了应用微服务体系结构时会遇到的问题。如API网关模式定义了客户端如何访问服务。

  • 分解模式
    • 按业务能力分解
    • 按子域分解
  • 每个服务模式的数据库描述了每个服务如何拥有自己的数据库,以确保松耦合。
  • API网关模式定义了客户机如何访问微服务体系结构中的服务。
  • 客户端发现和服务器端发现模式用于将客户端请求路由到微服务体系结构中的可用服务实例。
  • 消息传递和远程过程调用模式是两种不同的服务通信方式。
  • 每个主机的单个服务和每个主机的多个服务模式是两种不同的部署策略。
  • 交叉关注模式:微服务机箱模式和外部化配置
  • 测试模式:服务组件测试和服务集成契约测试
  • 断路器
  • 访问令牌
  • 可观测性模式:
    • 日志聚合
    • 应用程序度量
    • 审核日志记录
    • 分布式跟踪
    • 异常跟踪
    • 健康检查API
    • 记录部署和更改
  • 用户界面模式:
    • 服务器端页面片段组合
    • 客户端UI组成

著名案例

大多数大规模的web站点,如 Netflix, Amazon和eBay都从一体架构转变为微服务架构。

Netflix是个非常受欢迎的视频流服务提供商,占有多达30%的互联网流量,它有着大规模、基于服务的架构。他们每天处理800+不同类型设备超过10亿次视频流API的请求。每个API可以展开成平均6次对后端服务的调用。

Amazon.com原有个两层架构。为了伸缩,他们迁移到一个包含上百个后端服务的基于服务的架构。调用这些服务的应用中包括实现Amazon.com网站和web service API的应用。Amazon.com网站应用调用100-150个服务来获取数据用于构建网页。

拍卖网站ebay.com也从一体架构发展成基于服务的架构。应用层包含多个独立的应用。每个应用实现特定功能模块(如购买或销售)的业务逻辑。每个应用使用X轴的分隔,有些应用如搜索,使用Z轴分隔。Ebay.com也对数据库层采用X,Y,Z的组合伸缩方式。

译自:
https://microservices.io/patterns/microservices.html

背景

假设你在开发一个服务端应用。该应用必须支持各种各样的客户端,包括桌面浏览器、手机浏览器和本地手机应用。应用可能也需要公开部分API供第三方使用,还可能与其他应用通过web service或消息代理(message broker)相集成。应用执行业务逻辑来处理请求(HTTP请求或者消息);访问数据库;与其他系统交换消息;并返回HTML/JSON/XML类型的响应。

应用或是多层架构或是六角架构,并且包含多种类型的组件:

  • 表示组件(Presentation components) - 响应处理HTTP请求,并返回HTML或JSON/XML(对于web service API)
  • 业务逻辑(Business logic) - 应用的业务逻辑
  • 数据库访问逻辑(Database access logic) - 数据访问对象用于访问数据库
  • 应用集成逻辑(Application integration logic) - 消息层,如基于Spring的集成

这些逻辑组件分别响应应用中不同的功能模块。

问题

应用的部署架构是什么?

动机

  • 该应用由一个开发者团队在维护
  • 团队新成员必须快速上手
  • 应用应该易于理解和修改
  • 你想对应用进行持续集成
  • 你必须在多台机器上部署多份应用的拷贝,以满足可伸缩性和可用性的要求
  • 你想使用新技术(框架、编程语言等)

解决方案

使用一体化架构构建应用。如:

  • 单个Java WAR文件
  • 单个Rails或NodeJS目录结构

举例

我们假设你在构建一个电子商务应用,应用从客户接收订单,验证库存和可用额度,并派送订单。应用包含多个组件,包括StoreFrontUI,用来实现用户接口,以及一些后台服务,用于检测信用额度、维护库存和派送订单。

应用作为一体应用部署。例如,一个Java web应用运行在Tomcat之类web容器上,仅包含单个WAR文件;一个Rails应用使用Phusion Passenger部署在Apache/Nginx上,或者使用JRuby部署在Tomcat上,它们都仅包含单个目录结构。为了伸缩和提高可用性,你可以在一个负载均衡器下面运行该应用的多份实例。

结果

这个方案有一些好处:

  • 易于开发 - 当前开发工具和IDE的目标就是支持这种一体应用的开发
  • 易于部署 - 你只需要将WAR文件或目录结构放到合适的运行环境下
  • 易于伸缩 - 你只需要在负载均衡器下面运行应用的多份拷贝就可以伸缩

但是,一旦应用变大、团队增长,这种方法的缺点就愈加明显:

  • 巨大的一体代码库可能会吓到开发者,尤其是团队的新人。应用难于理解和修改。因此,开发速度通常会减缓。另外,由于没有模块硬边界,模块化也随时间而破坏。还有,因为难于理解如何实现变更,代码质量也随时间下降。这是个恶性循环!
  • 超载的IDE - 代码库越大,IDE越慢,开发者效率越低。
  • 超载的web容器 - 应用越大,容器启动时间越长。因此开发者大量的时间被浪费在等待容器启动上。这也会影响到部署。
  • 难于持续部署 - 对于频繁部署,巨大的一体应用也是个问题。为了更新一个组件,你必须重新部署整个应用。这还会中断后台任务(如Java应用的Quartz作业),不管变更是否影响到这些任务,此外还可能引发问题。未被更新的组件也可能因而不能正常启动。因此,鉴于重新部署的相关风险会增加,不鼓励频繁更新。这尤其对用户界面的开发者来说是个问题,因为他们通常需要快速迭代,频繁重新部署。
  • 难于伸缩应用 - 一体架构只能在一个维度伸缩。一方面,它可以通过运行多个拷贝来伸缩满足业务量的增加。某些云服务甚至可以动态地根据负载调整应用实例的数量。但是另一方面,该架构不能伸缩满足数据量的增加。每个应用实例都要访问全部数据,这使缓存低效,并且提升了内存占用和I/O流量。而且,不同的组件所需资源不同 - 有些可能是CPU密集型的,另一些可能是内存密集型的。一体架构下,我们不能独立伸缩各个组件。
  • 难于调整开发规模 - 一体应用对调整开发规模也是个障碍。一旦应用达到一定规模,将工程组织分成专注于特定功能模块的团队通常更有效。比如,我们可能需要UI团队,会计团队,库存团队等。一体应用的问题是它阻碍组织团队相互独立地工作。团队之间必须在开发进度和重新部署上进行协调。对团队来说也很难改变和更新产品。
  • 需要对一个技术栈长期投入 - 一体架构迫使你娶下开发初选择的技术栈(某些情况下,是那项技术的某个版本)。一体架构下,很难递增式地采用更新的技术。比如,想象下你选了JVM。除了Java你还可以选择其他使用JVM的语言,它们比如Groovy和Scala也可以与Java很好地进行互操作。但是一体架构下,非JVM语言写的组件就不行。而且,如果应用使用了后期过时的平台框架,将应用迁移到更新更好的框架上就很有挑战性。还有可能,为了采用新的平台框架,你要重写整个应用,这就太冒险了。

相关模式

微服务架构是解决一体化架构缺点的替代模式。

已知案例

著名的互联网服务,如Netflix, Amazon.com和eBay开始都使用一体架构。作者开发的大部分web应用也是一体架构的。

译自:
https://microservices.io/patterns/monolithic.html

前言:本来只想做一个“什么是微服务架构”,后来发现有许多基础的知识如果不做会很难看懂,因此把软件架构和常用的架构风格也一并讲了。大佬们的请直接移步第三部分。

软件架构

软件架构的定义

要理解微服务架构,首先要理解什么是软件架构。

计算机系统的软件架构是构建这个系统所需要的一组结构,包括软件元素、它们之间的关系以及两者的属性。————卡耐基梅隆大学 Len Bass

这句话,本质上就是在讲:应用程序的架构是将软件分解为元素(element),这些元素之间的关系(relation),以及这些元素自有的属性(property)。

软件架构的意义

应用程序有两个层面的需求。第一类是功能性需求,这些需求决定一个应用程序做什么。这些通常都包含在用例(use case)或者用户故事(user story)中。应用的架构其实跟这些功能性需求没什么关系。功能性需求可以通过任意的架构来实现,甚至是非常糟糕的大泥球架构。

架构的重要性在于,它帮助应用程序满足了第二类需求:非功能性需求。我们把这类需求也称之为质量属性需求,或者简称为“能力”。这些非功能性需求决定一个应用程序在运行时的质量,比如可扩展性和可靠性。它们也决定了开发阶段的质量,包括可维护性、可测试性、可扩展性和可部署性。为应用程序所选择的架构将决定这些质量属性。

也可以从以下几点来讲软件架构的意义:

  • 它促进了劳动和知识的分工。它使具有特定专业知识的人们(或多个团队)能够就应用程序高效地协同工作。
  • 它定义了软件元素的交互方式。
  • 将软件分解成元素以及定义这些元素之间的关系,决定了软件的能力。

软件架构的4+1视图模型

每个视图的目的如下:

逻辑视图:开发人员创建的软件元素。在面向对象的语言中,这些元素是类和包。它们之间的关系是类和包之间的关系,包括继承、关联和依赖。

实现视图:构建编译系统的输出。此视图由表示打包代码的模块和组件组成,组件是由一个或多个模块组成的可执行或可部署单元。在Java中,模块是JAR文件,组件通常是WAR文件或可执行JAR文件。它们之间的关系包括模块之间的依赖关系以及组件和模块之间的组合关系。

进程视图:运行时的组件。每个元素都是一个进程,进程之间的关系代表进程间通信。

部署视图:进程如何映射到机器。此视图中的元素由(物理或虚拟)计算机和进程组成。机器之间的关系代表网络。该视图还描述了进程和机器之间的关系。

除了这四个视图以外,4+1中的+1是指场景,它负责把视图串联在一起。每个场景负责描述在一个视图中的多个架构元素如何协作,以完成一个请求。例如,在逻辑视图中的场景,展现了类是如何协作的。同样,在进程视图中的场景,展现了进程是如何协作的。

常用的架构风格

架构风格的定义如下:

架构风格根据结构组织模式定义了一系列此类系统。更具体地说,架构风格确定可以在该风格的实例中使用的组件和连接器的词汇表,以及关于如何组合它们的一组约束。————David Garlan and Mary Shaw

特定的架构风格提供了有限的元素(组件)和关系(连接器),你可以从中定义应用程序架构的视图。应用程序通常使用多种架构风格的组合。例如,单体架构可以通过不同的风格通的实现视图构造为单个(可执行与可部署)组件的架构样式。微服务架构将应用程序构造为一组松散耦合的服务,也可以通过不同的风格进行表示。

分层式架构风格

架构的典型例子是分层架构。分层架构将软件元素按“层”的方式组织。每个层都有明确定义的职责。分层架构还限制了层之间的依赖关系。每一层只能依赖于紧邻其下方的层(如果严格分层)或其下面的任何层。

可以将分层架构应用于前面讨论的四个视图中的任何一个。流行的三层架构是应用于逻辑视图的分层架构。它将应用程序的类组织到以下层中:

  • 表现层:包含实现用户界面或外部API的代码。
  • 业务逻辑层:包含业务逻辑。
  • 数据持久化层:实现与数据库交互的逻辑。

分层架构是架构风格的一个很好的例子,但它确实有一些明显的弊端:

  • 单个表现层:它无法展现应用程序可能不仅仅由单个系统调用的事实。
  • 单一数据持久化层:它无法展现应用程序可能与多个数据库进行交互的事实。
  • 将业务逻辑层定义为依赖于数据持久化层:理论上,这样的依赖性会妨碍你在没有数据库的情况下测试业务逻辑。

此外,分层架构错误地表示了精心设计的应用程序中的依赖关系。业务逻辑通常定义数据访问方法的接口或接口库。数据持久化层则定义了实现存储库接口的DAO类。换句话说,依赖关系与分层架构所描述的相反。

六边形架构风格

六边形架构是分层架构风格的替代品。如图所示,六边形架构风格选择以业务逻辑为中心的方式组织逻辑视图。应用程序具有一个或多个入站适配器,而不是表示层,它通过调用业务逻辑来处理来自外部的请求。同样,应用程序具有一个或多个出站适配器,而不是数据持久化层,这些出站适配器由业务逻辑调用并调用外部应用程序。此架构的一个关键特性和优点是业务逻辑不依赖于适配器。相反,各种适配器都依赖业务逻辑。

业务逻辑具有一个或多个端口(port)。端口定义了一组操作,关于业务逻辑如何与外部交互。例如,在Java中,端口通常是Java接口。有两种端口:入站和出站端口。入站端口是业务逻辑公开的API,它使外部应用程序可以调用它。入站端口的一个实例是服务接口,它定义服务的公共方法。出站端口是业务逻辑调用外部系统的方式。出站端口的一个实例是存储库接口,它定义数据访问操作的集合。

业务逻辑的周围是适配器。与端口一样,有两种类型的适配器:入站和出站。入站适配器通过调用入站端口来处理来自外部世界的请求。入站适配器的一个实例是Spring MVC Controller,它实现一组REST接口(endpoint)或一组Web页面。另一个实例是订阅消息的消息代理客户端。多个入站适配器可以调用相同的入站端口。

出站适配器实现出站端口,并通过调用外部应用程序或服务处理来自业务逻辑的请求。出站适配器的一个实例是实现访问数据库的操作的数据访问对象(DAO)类。另一个实例是调用远程服务的代理类。出站适配器也可以发布事件。

六边形架构风格的一个重要好处是它将业务逻辑与适配器中包含的表示层和数据访问层的逻辑分离开来。业务逻辑不依赖于表示层逻辑或数据访问层逻辑。

由于这种分离,单独测试业务逻辑要容易得多。另一个好处是它更准确地反映了现代应用程序的架构。可以通过多个适配器调用业务逻辑,每个适配器实现特定的API或用户界面。业务逻辑还可以调用多个适配器,每个适配器调用不同的外部系统。六边形架构是描述微服务架构中每个服务的架构的好方法。

reference:
https://mp.weixin.qq.com/s/r9eKHhEKWo5TovFN87HtPw

自我认识

有人对自己工作进行抱怨时,经常会用到“不会做,不好做,不想做”这样的词语。然而“不会做”,“不好做”,“不想做”表达的是同样的含义么?这些表述背后又透露了什么信息呢?

为了帮助大家分析自己,美国著名心理学家麦克利兰提出了一个“冰山模型”,把一个人的素质要素分成了三类:

  1. 知识、技能
  2. 能力
  3. 价值观、性格特质、动机

知识、技能 能力 价值观、性格特质、动机
解释 通过学习和实践获得的可以使用在特定领域的认知、经验、技术,如学过的数学知识、写作修辞手法、office套件的使用方法等 可以在不同领域使用的通用能力,如学习能力、人际交往能力 判断事物的是非标准、行为偏好、成就动机、权利动机、亲和动机
和工作不匹配的表现 不会做,慌乱焦虑、无所适从 不好做,低效、无奈 不想做,矛盾纠结、没热情、心累

职业匹配

职业,本质上是关键业务的集合。看一个人和他的职业匹不匹配,就是看他是否需要、擅长、喜欢自己负责的业务。

可以通过下表来对自己和职业的匹配进行评估,只需要根据冰山模型填上自己的个人素质、自己目前需要什么(钱、社区、人脉等),再根据和每个业务的匹配关系给出1-5的评分即可。

个人素质 业务1的匹配分数 业务2的匹配分数 ...
喜欢 价值观
性格特质
动机
擅长 知识
技能
能力
需要 需要

职业调整

当我们对自己进行职业匹配之后,发现自己不喜欢、不擅长、不需要某一份工作的时候应该怎么办呢?

不喜欢

不喜欢是和一个人的根本挂钩的,很难靠改变自己来喜欢上某个工作或者业务,最好是对工作进行调整:

  1. 调整业务内容和目标(业务内调整)
  2. 更换负责的业务(岗位内调整)
  3. 请求更换岗位(公司内调整)
  4. 跳槽

不擅长

不擅长说白了是自己的知识储备不够、技术水平不过关、能力不足导致的。需要不是外界的调整,而是自我的提升。

不需要

不需要,本质上是这份工作不能满足你的某些需求。那么只需要分析其中的原因即可:

  1. 业务原因。这个业务不被重视,没有前景,可能会被砍掉
  2. 行业原因。行业普遍工资低/加班等
  3. 职业原因。某类岗位就是重复性机械劳动,难以接触新的事物
  4. 公司原因。这公司药丸

分析清楚了原因,就知道从哪里下手了。

内在提升

时间要投入到自我提升上,才会有工资的提升。自我提升有以下几种:

知识提升

提升自己的知识储备,不必每次都去搜索学习。

但是要注意,学了知识之后,如果可以灵活运营,则满腹经纶指点江山,否则就是读死书,浪费时间。

因此,要注意:

  1. 要学会提取知识的核心,掌握20%的核心知识。比如做ppt漂亮的核心就是饱和度、边框、行间距
  2. 知识和问题关联起来,学习知识的时候就要联系到它能解决什么问题
  3. 系统化训练,刻意使用刚刚学到的知识,不要快速遗忘

技能提升

技能的定价和天花板取决于其稀缺性。

某一技能可能在稀缺时期很值钱,但是随着供求关系发生变化,其市场价值依然会产生波动。

能力提升

技能熟练,只是一个好兵,能力强大,才能得到提升,成为将才。

能力提升可以跨行业跨职业,一旦积累到一定高度,换个公司、行业、职业一样可以吃的开,挣到钱。

提升自我、认识自我

提升自我:对事物有更加深刻的看法,有更加成熟的三观,锻炼自己的某种特质

认识自我:有自知之明,找到更加适合自己的环境和土壤

外在提升

外在提升主要就是提升自己周围的环境,物理环境和社会环境。

物理环境的提升可以通过搬家、打扫卫生等完成。

社会环境,主要由自己的人脉构成,扩展、优化自己的人脉,就是提升自己的社会环境的过程。

提升过程中需要注意以下几个误区:

  1. 皇冠综合症:只顾低头做事,等待伯乐发现自己,给自己戴上皇冠,这是不对的。要学会主动争取,树立个人品牌,展现自己的价值
  2. 名片囤积:人脉的构建不是基于名片的互换,而是基于价值的互换

人脉关系中存在以下几种角色,可以帮助你迅速定位自己:

  1. 节点:把大家连接在一起的人
  2. 专家:掌握信息、知识甚至是资源的人
  3. 明星:有强烈个人魅力的人
  4. 助理:在圈子里提供服务的人

持续成长

  1. 长远规划,给自己定好发展方向
  2. 提升能力,成为可迁移人才
  3. 提升认知高度,成为纵向深度人才,多思考:
    • 这个行业中的关键成功要素是什么
    • 行业的社会价值是什么
    • 部门、岗位、公司的核心价值是什么

在成长的几个阶段,需要注意:

  1. 起步期:靠自己
    • 思维方面,形成独立见解
    • 效率方面,学会多任务,能够高效处理工作,管理时间
    • 沟通方面,理解他人需求,条理清楚
    • 交际方面,懂得人际拓展方法
  2. 发展期:靠别人
    • 思维方面,掌握解决复杂问题、拆分工作的方法
    • 效率方面,懂得如何辅导和激励下属工作,不让自己累死
    • 沟通方面,掌握说服他人的技巧,懂得公开表达
    • 交际方面,能够处理团队内部或跨部门的冲突,进行高难度沟通
  3. 成熟期:靠影响力
    • 思维方面,要更加有高度,掌握战略思维、经济学思维等
    • 效率方面,掌握运营和财务的知识,更好的配置资源
    • 沟通方面,了解公司,知道如何向用户推销自己,营销思维
    • 交际方面,全面进阶的领导力

缘起

现在的年轻人大多更加讲究效率,对于为什么、怎么回事问的少了,只为了更加关注于事情本身,任何细节都不愿放过:即便要靠脑补来填充。而很多故事的有趣之处,其实也就是在缘起之处,这里是万事之始,这里种下了一切的因缘。

本人男,直博二年级在读,学校姑且叫Z大好了。博士毕业,无非三点:论文、论文、还有论文。第一个论文是SCI(主要是期刊论文),第二个论文是EI(主要是会议论文),第三个论文叫做“优秀的、有一定影响力的工作”。为了能够按时毕业,我投稿了专业领域的一个知名会议:E会。投稿的另一个原因是,E会2019年的会址在米兰,我还未曾去过。我的导师也未曾去过。

不幸的是,由于动机不纯导致文章灌水灌的有失水准,我的文章被reject。故事本应结束,导师却凌空一指:转投E会旗下的workshop。所谓workshop,可以看作一个会议旗下的子会,虽然没什么影响力,又对博士毕业、教授职称之类的没什么帮助,好在与E会共享会址和所有安排,于外可以交流学习、于内可以交差报销。于是,我的文章经过一轮大修,不出意外的中了一个workshop,H子会。

中了之后我的第一反应是:可惜了我的文章。第一次被拒我是认的,写的仓促,实在垃圾。大修之后我感觉这篇文章火候已经小成,只中一篇workshop,未免有些可惜了。

算了,为了米兰,算了。

准备

说来惭愧,从进入大学开始,便一直叫嚣要出国旅游一趟,却由于种种原因一直未能成行。

这句话我原本深信不疑,直到我真的要出国了,我才发觉其中的问题。种种原因其实只有一个:怂。没错,要出国了,要去意大利了,要去米兰了,我怂了。

有人说欧洲资本主义国家先进发达,吐槽国内保守落后,但是真的要出国了,才觉得国内真乃世外桃源。手机支付暂且不谈,主要是安全问题,意大利的治安在欧洲算是一般,但依然不安全。问起身边的人才知道,国内的两位老师日前去意大利访学,在街头被公然抢包;学生旅游,被偷包偷钱的更是不胜枚举。离别之时才想起家里的好,多年在外求学,如今终于要念起乡愁了。

再者就是意大利并不怎么说英语,主要还是讲意大利语。这就麻烦了,都说学好英国话,走遍天下都不怕,意大利与英国不远,语言却已然不同。好在我天赋异禀,出行一周前,只花了4天便入门了意大利语,又花了3天将其忘得一干二净。到了意大利,英语,真香。

为了这8天7夜的旅游交流学习,经过一通调查,我带了

  • 剃须刀
  • 两部手机及充电器:一部手机放国外的流量卡
  • 充电宝
  • 一个意标插口转换器
  • 国标插线板
  • 几套衣服
  • 拖鞋、牙刷牙膏护肤品:意大利很多酒店都不提供,最好还是自己带上
  • 护照、身份证+护照申请各项材料:入境的时候可能会看
  • 国外信用卡:大部分地方都是可以刷信用卡的
  • 400欧元:所有地方都收现金,不需要给小费

申请签证就不细讲了,意大利大使馆官网上有一个清单,照着准备就是。大学生可以不准备父母的关系证明,但是银行卡上要存个2、3万,让签证官相信你有钱回来。

课文

对话1

Giulio:Ciao Marta. Vieni, entra! 嗨玛塔。来吧,进来!

Marta:Grazie! Tu sei Giulio, vero? 谢谢!你是朱利奥,不是吗?

Giulio:Sì, in persona! Come stai? 是的,亲自(就是本人)!你好吗?

Marta:Tutto bene, grazie! Siena mi piace molto. Mi sembra una città molto vivace 好的,谢谢!我真的很喜欢锡耶纳。在我看来,这是一个非常活跃的城市

Giulio:Sono d’accordo con te! Anche a me piace abitare in questa città 我同意你的看法!我也喜欢住在这个城市

Giulio:Io sono di Sassari ma vivo a Siena da quattro anni 我来自萨萨里,但在锡耶纳住了四年

Giulio:e sempre in questo appartamento 而且总是在这间公寓里

Marta:Davvero? Allora ti trovi bene qui… 真的吗?那你在这里感到很舒服……

Giulio:Hai ragione, mi piace molto questa casa 你是对的,我真的很喜欢这个房子

Giulio:Vieni, ti faccio vedere la camera libera 来吧,我会告诉你空的房间

Marta:Okay, andiamo! 好的,我们走吧!

Giulio:Ecco, questa è la singola 在这里,这是单间

Giulio:C’è un letto da una piazza, un armadio, una scrivania 配有一张单人床,衣柜和书桌

Giulio:c’è una lampada sul comodino 床头柜上有一盏灯

Giulio:È una stanza luminosa perché ci sono due finestre! 这是一个明亮的房间,因为有两个窗户!

Marta:È vero, c’è molta luce anche oggi che il cielo è grigio 确实,即使在今天天空是灰色的时候也会有很多光

Marta:Secondo me fra poco comincia a piovere! 我想它很快就会下雨!

Marta:Senti, ma quanti bagni ci sono? 看,有多少间浴室?

Giulio:Solo uno. Però finora non ci sono stati problemi con gli altri coinquilini 只有一个。但到目前为止,其他室友没有遇到任何问题

Marta:Sì, poi basta avere un po’ di pazienza… C’è la doccia o la vasca da bagno? 是的,然后有点耐心……有淋浴或浴缸吗?

Giulio:La doccia. Vieni, è di qua, guarda! 淋浴。来吧,这就是它,看!

Marta:Bella! E anche il colore del bagno mi piace: io amo il blu! 美丽!我也喜欢浴室的颜色:我喜欢蓝色!

Giulio:E questa è la cucina. È un po’ piccola ma c’è tutto quello che serve: 这是厨房。它有点小,但有你需要的一切:

Giulio:piatti, bicchieri, pentole, frigo, fornelli, e forno ma non funziona bene 盘子,杯子,锅,冰箱,炉子和烤箱,但它不能很好地工作(不一定好用)

Giulio:Sai qui non siamo bravi cuochi… 你知道我们这里不是好厨师……

Giulio:Mangiamo molte insalate e pasta. Tu sai cucinare? 我们吃了很多沙拉和意大利面。你能做饭吗?

Marta:Mah… insomma. Mamma mi ha insegnato qualche ricetta ma… 嗯……简而言之。妈妈教我一些食谱,但……

Giulio:Okay, se vieni a abitare con noi le proveremo le ricette della tua mamma! 好的,如果你和我们住在一起,我们会尝试你妈妈的食谱!

Giulio:E questo è il soggiorno 这是起居室

Giulio:un tavolo con quattro sedie, il televisore, il divano e la poltrona 一张桌子有四把椅子,电视,沙发和扶手椅

Giulio:I mobili sono un po’ vecchi ma ancora in buone condizioni 家具有点旧,但仍然状况良好

Giulio:Insomma, di solito ci troviamo tutti qui per mangiare 总之,我们通常都在这里吃饭

Giulio:e rilassarci dopo il lavoro 下班后放松一下

Marta:Bella, anche questa stanza è luminosa 美丽,这个房间也很明亮

Giulio:Sì, anche qui c’è una finestra grande 是的,即使在这里也有一个大窗户

Marta:E la camera dell’altra ragazza? 而另一个女孩的房间?

Giulio:Anche Tania ha una singola 塔尼亚也有单间

Giulio:È la stanza in fondo al corridoio, quella vicina al bagno 是走廊尽头的房间,靠近浴室的房间

Marta:Senti, l’appartamento mi piace! 看,我喜欢这套公寓!

Giulio:Anche la zona è perfetta perché è molto vicino all’ospedale 该地区(位置)也很完美,因为它离医院很近

Marta:Sì, è vero. E l’atmosfera in casa è divertente! 是的,这是真的。房子里的气氛很有趣!

Marta:Benissimo, allora ho deciso, prendo in affitto la camera 很好,然后我决定,我租房间

Marta:Quando posso venire? 我什么时候能来?

Giulio:Sono contento! Vieni quando vuoi, anche domani 我很高兴!随时随地,即使是明天

Giulio:Intanto dico a Tania che abbiamo trovato una ragazza per la singola 与此同时,我告诉塔尼亚,我们为单间找到了一个女孩

Marta:Okay, allora vengo domani mattina alle 11 好的,所以我明天早上11点来

Marta:Sei in casa o ti devo telefonare un po’ prima? 你在家还是我早点打电话给你?

Giulio:Sarò a casa. Faccio i turni al lavoro e domani lavoro di notte 我会回家。我明天晚上轮流上班,晚上上班

Giulio:Stai tranquilla, ti aspetto qui! 放心,我会在这儿等你!

Marta:Grazie Giulio, sei davvero gentile! A domani… e non vedo l’ora! 谢谢朱利奥,你真的很善良!明天见!我等不及了!

课文

对话1

Marta:Buongiorno, mi chiamo Marta, telefono per l’annuncio della camera in affitto 您好,我的名字是Marta,电话是看到了租房间的公告

Giulio:Buongiorno! 你好!

Giulio:Sì, la camera è ancora libera. Sei di Siena? 是的,房间仍然是空的。你是在锡耶纳吗?

Marta:No, di Pescare. Sono appena arrivata a Siena 不,我在Pescare。我刚刚抵达锡耶纳

Giulio:Lavori o studi? 工作还是学习?

Marta:Lavoro, faccio l’infermiera… 我工作,我是一名护士……

Giulio:Vuoi vedere la camera? 想看房间吗?

Marta:Sì certo, la vedo volentieri! È una camera singola, vero? 是的,当然,我心甘情愿地看到它!这是单人间,不是吗?

Marta:Prima vorrei sapere quanto costa 我首先想知道一个月租金多少

Marta:sto facendo un tirocinio in ospedale e non posso spendere molto 我在医院实习,而且我不能花太多钱

Giulio:250 euro. Per una singola non è molto! 250欧元。对于一个单间的它并不多!

Giulio:Sai che in città gli affitti sono abbastanza cari… 你知道在城市租金很贵……

Marta:Le spese sono incluse? 是否包括(全部其他)费用?

Giulio:Tutto incluso eccetto il telefono che è a parte 全包,但电话除外

Marta:Il prezzo va bene 价格还可以

Marta:L’annuncio dice che l’appartamento è vicino all’ospedale 公告称该公寓靠近医院

Marta:Puoi darmi altre informazioni? 你能给我更多信息吗?

Giulio:L’appartamento è vicino a Piazza Libertà a due minuti dall’ospedale 公寓靠近PiazzaLibertà,距医院仅2分钟路程

Giulio:È luminoso, carino 它很明亮,很舒适

Giulio:C’è anche la lavatrice 还配有一台洗衣机

Giulio:In casa ci abito io e una ragazza 我和一个女孩住在房子里

Giulio:che fa la cameriera in un hotel in centro 她是市中心酒店的女服务员

Giulio:È simpatica 她很好(人很好)

Marta:Bene, sembra tutto perfetto… ma cose negative? 好吧,一切看起来都很完美……但是缺点呢?

Giulio:Forse l’unico problema è il rumore del bar di fronte alle nostre finestre 也许唯一的问题是我们窗户前酒吧的噪音

Giulio:Alcune sere, in particolare d’estate 有些晚上,特别是在夏天

Giulio:ci sono ragazzi che parlano forte e a volte cantano fino a tardi… 有些人大声说话,有时候唱到很晚……

Marta:Comunque vorrei vedere l’appartamento 不过我想看看公寓

Marta:perché devo trovare presto una camera 因为我必须尽快找到一个房间

Marta:Ora sono ospite di una collega ma non posso restare a lungo 现在我是同事的客人(在我同事家住),但我不能待久

Marta:perché ci sono già troppe persone in quell’appartamento 因为那间公寓里的人已经太多了

Giulio:Io domani mattina sono a casa dalle 10 in poi. Tu quando sei libera? 明天早上我从上午10点开始回家。你什么时候有空?

Marta:Alle undici e mezza va bene? 十一点半可以吗?

Giulio:Allora ti aspetto in via Dante 37, interno 3 然后我在Dante 37号,3里面等

Marta:Okay, grazie mille, ci vediamo domani! Ma come ti chiami? 好的,非常感谢,明天见!但是你的名字是什么?

Giulio:Oh, scusa non mi sono presentato. Sono Giulio, Giulio Conti 哦对不起,我没有出现。我是Giulio,Giulio Conti

Marta:Ciao Giulio! A domani 好的Giulio!明天见

课文

对话1

Mario:Buongiorno! 早上好!

Anna:Buongiorno. Vorrei usare internet 早上好。 我想使用互联网

Mario:Certo. Può usare il computer n°3 当然。 您可以使用计算机#3

Anna:Come si usa? È la prima volta che vengo ad un internet point 怎么用? 这是我第一次来到互联网点

Mario:Lei mi dà un documento di identità 给我一张身份证

Mario:io la registro e le do un username e una password 我会录制它并给你一个用户名和密码

Mario:Lei inserisce questi dati prima di accedere ad internet e quando ha finito, clicca su logout 您在访问互联网之前输入此数据,完成后点击注销

Anna:Quanto costa? 它需要多少钱?

Mario:Dipende da quanto tempo usa internet. Il minimo è mezz’ora e costa 1 euro 这取决于你使用互联网的时间。 最短为半小时,费用为1欧元

Anna:Ho visto che ci sono delle cabine telefoniche 我看到有电话亭

Anna:Quanto costa chiamare all’estero? 打电话到国外需要多少钱?

Mario:Dipende dal paese, signora 女士,取决于国家

Mario:Lei compra una scheda e ha un tot di minuti a disposizione 你买了一张卡,有几分钟可用

Anna:Quanto costa una scheda? Mia sorella non sta molto bene e devo telefonarle 一张卡多少钱? 我姐姐(身体)不是很好,我得给她打电话

Mario:Quella da 60 minuti costa 5.50 euro, quella da 120, ne costa 20 60分钟的费用为5.50欧元,120分钟的费用为20分钟

Anna:Mi dia quella da 20 euro 给我那20欧元(的电话卡)

Mario:Bene, ecco a lei 嗯,这是给你的

Anna:Grazie. Qual è il numero del computer, scusi? 谢谢。 电脑编号是多少,对不起?

Mario:Il 3, da quella parte 3,在那一边

Anna:Grazie mille 非常感谢你

Mario:Prego 请(不客气)

课文

对话1

Anna:Buon giorno signore, desidera? 早上好,先生,想要(买东西)?

Mario:Posso vedere quella giacca Bianca esposta in vetrina? 我可以(看看)在窗口看到那件白色夹克吗?

Anna:Che taglia ha? 多大号?

Mario:La 44 44(号)

Anna:Adesso quarto, Signore, è fortunata: è propio la sua taglia 现在第四(我找找看),先生,很幸运:这是你的身材(尺寸)

Mario:Vediamo… Di che stoffa è? 让我们看看……它有什么材料?

Anna:Di lino: Pratico ed elegante 是亚麻的:实用而优雅

Mario:Mi piace molto. Posso provarla? 我非常喜欢它。 我可以试试吗?

Anna:Certamente, si accomodi in camerino 当然,坐在更衣室里

Mario:Questa giacca mi va benissimo e questo modello mi sta bene 这件夹克非常适合我,这一款式看起来很棒

Anna:Veramente le va a pennello 实际上非常合身

Mario:Quanto costa? 它需要多少钱?

Anna:Con lo sconto del 50%, paga solo 200 euro. Un vero affare! 享受50%的折扣,只需支付200欧元。 一个真正的讨价还价(非常实惠)!

Mario:Va bene la compro. Posso pagare con un assegno? 好吧我买了。 我可以用支票付款吗?

Anna:Senz’altro. Alla cassa prego 当然可以。 请在收银台(付款)