欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

十万的License只取决于一个连接

程序员文章站 2022-07-05 15:18:14
前段时间看到一份代码,小规模、低难度的一个应用,MVC用到极致,业务逻辑却混成一团麻,应该是中了培训班的毒。现在的程序员,大多是没仔细读过《现代操作系统》,没看过编译原理,不知道堆与栈,没怎么用过C、C++,上手就Java、C#,程序一开就内存狂飙,数据库连接随手就建,但这种人算是相当多了,见多了也 ......

十万的License只取决于一个连接

前段时间看到一份代码,小规模、低难度的一个应用,mvc用到极致,业务逻辑却混成一团麻,应该是中了培训班的毒。现在的程序员,大多是没仔细读过《现代操作系统》,没看过编译原理,不知道堆与栈,没怎么用过c、c++,上手就java、c#,程序一开就内存狂飙,数据库连接随手就建,但这种人算是相当多了,见多了也就习惯了。

前两天看到一篇文章,作者使用的是intersystems的数据库,这是一个美国公司,为医疗卫生行业提供重要的网络平台,不少国外的ivd厂商都有用到。作者描述的问题很简单:

服务器相当的不稳定,每天都会宕机。
挂了的时候所有的程序都连接不上数据库,大概过10分钟左右又好了!
找来找去说是数据库的license不够了,所以不让新的连接上来,那就纳闷了。虽然intersystem公司卖的license贼贵,一个就要十万块,但是通过加上ecp,基本上就多出来1000个license units,咋还会不够用呢?

首先,license 授权是个相当复杂的计算方式,拿 sql server 来说,sql server不同的版本有不同的功能,不仅价格颇有差异,获得许可的方式也不尽相同,高的有1万9千多刀,总的来说,有两种基本的授权(license)模式。

一、“每处理器”或“每核”模式
“每处理器”(per processor)授权模式只计算物理处理器的数量,与物理处理器的内核数量无关。按“每核”(per core)计数,同时还需要计算物理处理器(插槽)的数量,单个插槽最低需要购买4核。

这一授权模式可以很好的简化授权的复杂程度,不用统计有多少用户(或者设备)会访问sql server,以及是防火墙内部还是来自internet的外部连接。

二、“server+cal”模式
cal即客户端访问许可(client access license),分为设备访问许可(device cal)和用户访问许可(user cal)两类。sql server及其组件(例如报表服务)提供服务,客户端则是访问这些服务的设备或用户。

购买cal时需要考虑有多少客户端需要访问sql server并从中获取数据,客户端的计算方式与中间层无关,只与最终有多少客户端能够获取(包括浏览、修改、删除数据等)sql server服务器中的数据有关。

标准功能每客户端大概940刀。

回到主题,作者在license usage 里面看到license usage by user,同一个ip对应多个连接数但是userid还是一样的,也就是说你开n个连接或者程序,userid都是相同的,而且都是同一ip地址,当然,用的license也就是一个,但是,你会发现原来它会计算connections,也就是连接数。
问题来了:

if the number of processes exceeds this maximum, a transition occurs and caché begins allocating one license unit per process for that user id. the system presumes that if more than maxconn connections are associated with a user id, multiple users are accessing caché through an intermediary, (for example, a firewall system) so additional license units are required. therefore, when the (maxconn + 1) process starts, the number of license units allocated to that user id changes from one to (maxconn + 1). processes started by the job command are allocated against the process limit of the user id invoking the job command.

原来一个license的进程数或者连接数是有最大限制的,如果超过这个最大限制的话,那就变成了每个连接都使用给一个单独license,难怪服务器会爆掉了。

比如我这边看最大连接数是25。
那就很少了,设备启动时候的用job函数增加的进程也算在内,如果我们在这台电脑启动多个接口那就占用了多个进程数量了,万一多开几个程序,那完了,就爆了。

为啥有这个规定呢?
可能是为了控制你不用路由器的,如果你用路由的话对公网的ip地址都是一样,cache就没法判断你到底有多少个终端了。
对于这种问题能怎么办呢,只能想办法优化一下连接数了。

这里要吐槽一下,国内的lis厂家开发人员的水平跟互联网公司差十万八千里,当然,也可以推到dba身上,因为99.99%的lis厂家和大部分的医院都没有dba。无论是内部开发还是第三方调用,都是一个用户,完全不考虑安全性问题,或者也有考虑安全性的,就是不开放数据访问,也不提供接口,逼第三方去想歪招;不过我已经看到有些lis厂家已经开始提供webservice接口了,虽然没有遵循astm协议或hl7协议,但也是一个进步。
回到最前面说到问题,小应用场景或开发环境下,该做的优化不做,如果遇到这样的问题呢,总不能让客户花十万买license,只有优化连接数了,优化、测试的时间成本呢,客户的时间成本呢,或者客户能等你改好吗?