SAP HANA 获取已登陆用户的详细信息

我们在浏览器上访问我们在 SAP HANA 上面部署的应用的时候,总会先跳转到一个 SAP ID Service 的页面并要求我们注册和登陆。在成功登陆 ID Service 后,这个用户身份就会作为我们在 Application 上的用户。

这是由于 SAP HANA Cloud Platform 采用了 single sign-on (SSO) 和身份绑定的方式,使开发者能无缝的将身份管理设施集成到 HANA Cloud Application 上。
这样做的好处是开发者无需开发单独的用户管理系统,用户信息由 identity providers (IdP) 提供并统一进行管理。
同时对于用户来说,使用统一的身份进行登陆,可以省去很多个人信息注册和更新的麻烦,并保证整个 HANA 平台上的应用间的身份信息一致。
这种做法应用开发者不需要再本地存储用户验证数据,能很好的避免信息丢失或泄露,对用户更有保障。

SAP-Cloud-IdP

当我们需要获取用户的信息来做相关的应用开发时(大部分时候是需要的),这种方式就给我们带来了极大的便利。我们只需要从 IdP 提供的接口就能很方便的获取到用户的信息。

SAP HANA 默认的 IdP 就是前面提到的 SAP ID Service,这是每个 HANA Application 的默认 IdP,维护了一整套的 SAP 体系内的用户信息。无论你是内部员工,还是外部客户,或者是 SCN 注册用户,都会由这个 Service 来进行维护。

SAP-ID-Service
Continue Reading…

SAP HANA 增量合并操作 (Delta Merge Operation)

我们都知道, SAP HANA 的数据更新方式是采用增量合并操作(Delta Merge Operation)的方式,原始数据在 Main 区域,新增加的数据在一个 Delta 区域,通过不断合并 Main 和 Delta 形成新的 Main,比普通的修改方式在性能上有着很大的优势。
今天看了一下整个增量合并操作中数据的读写和合并过程,感觉还是蛮有意思的。对很多应用场景下的数据增删修改合并操作有着很好的借鉴意义。

我们先来看一幅图:

sap-hana-delta-merge

Continue Reading…

简单聊聊并发编程

近期在看 Golang 相关的资料,虽然这门语言的类型后置让我这个 C 出身的人感到很难受,但是 Go 的种种特性确实让我眼前一亮。其中特别是并发,在云计算大数据如火如荼,分布式计算热火朝天的今天,这个特性让 Go 语言一下成为了明星语言。并发编程是面向对象编程中一种最合适的程序控制方式,因为在现实世界中,各个对象的各种操作都是并发的,其间通过消息传递来进行数据同步。

所以我们今天就来简单聊聊并发编程。

我们先了解一些并发编程中的概念:

1.延续性

并发编程中最关键的一个概念就是延续性(Continuation),这是一种对程序控制流程/状态的抽象表现形式。 延续性以数据结构的形式表现了程序在运行过程中某一点的计算状态,相应的数据内容能被编程语言访问并且不会被运行时环境所隐藏掉。
延续性包含了当前程序的栈以及当前运行的位置。一个延续的实例可以在将来被用作控制流,被调用时它从所表达的状态开始恢复执行。

延续性,其实就是一种函数调用机制。我们最常见的函数调用方法是使用堆栈,采用 Activation record 或者叫 Stack frame 来记录从最顶层函数到当前函数的所有 context 。一个 frame/record 就是一个函数的局部上下文信息,包括所有的局部变量的值和SP,PC指针的值。函数的调用前往往通过 push 来保存 context 信息,函数结束调用退出时则是取消当前的 record/frame,并恢复到上一个调用者的 record/frame 。这是一种后入先出的方式,上层函数需要获得下层函数返回的数据才能完成,因此你需要从顶层函数一层一层的往下调用,一直到最底层函数完成后,再逐层 return 依次完成。C/BASIC/PASCAL以及我们熟知的大部分语言就是采用这种方式。

而延续调用,不采用堆栈来保存上下文,而是把这些信息保存在 continuation record 中。这些 continuation record 和堆栈的 activation record 的不同,并不采用后入先出的堆栈存储方式,而是以节点的形式存放在树或者图中,从一个函数调用另一个函数就等于给当前节点生成一个子节点并系统寄存器移动到这个子节点上。
这样的好处是什么,就是我们不需要按照线性的顺序来完成函数,我们完全可以自由的在不同的节点间进行跳转,不需要像堆栈一样一层一层的 return。这里的 return 更像是一个带参数的 goto。
Continue Reading…