基于IPC机制浅析Tuxedo及其应用_MQ, Tuxedo及OLTP讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MQ, Tuxedo及OLTP讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 5172 | 回复: 0   主题: 基于IPC机制浅析Tuxedo及其应用        下一篇 
jack
注册用户
等级:上士
经验:284
发帖:24
精华:0
注册:2012-2-27
状态:离线
发送短消息息给jack 加好友    发送短消息息给jack 发消息
发表于: IP:您无权察看 2012-2-27 9:38:46 | [全部帖] [楼主帖] 楼主

    摘 要:
  本文从底层IPC机制出发,结合UNIX核心系统参数和ATMI技术,借用ipcs观察Tuxedo所消耗的IPC系统资源状况,浅析了Tuxedo强大功能背后的工作原理,进一步加深对Tuxedo应用和ATMI编程的理解,提出了并解决实际工作中关键问题的思路和步骤。
  关键词:
  进程间通信 共享内存 信号量 消息队列 Tuxedo ATMI

    一、进程间通信IPC主要工作机制简介(目录)
  进程间通信IPC (Inter-process communication)是一个Unix标准通讯机制,提供在同一台主机不同进程之间可以互相通讯的方法。 由于它是一种底层技术,因此具备了先天的灵活性。本文所涉及的IPC处理机制有3种:共享内存、信号量和消息队列。

  1.共享内存
  共享内存(Shared Memory)是一片指定的物理内存区域,这个区域通常是在存放正常程序数据区域的外面, 它允许两个或多个进程共享一给定的存储区,是针对其他通信机制运行效率较低而设计的。因为数据不需要来回复制,更不需要在客户机和服务器之间复制,进程可以直接读写内存,所以是最快的一种进程间通信机制。
为了实现更安全通信,它往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。在Tuxedo中,就是利用这个特性,将共享内存空间变成一种公告牌,用来公告进程状态信息和需要在进程间共享或传递的数据。

  2.信号量
  信号量(Semaphore)为那些访问相同资源的进程以及同一进程不同线程之间提供一个同步机制。它不是用于传输数据,而只是简单地协调对共享资源的访问。可以使用ipcs和ipcrm实现对信号量使用状态的查询和删除操作。
  信号量机制中,有一个概念是信号量组,它将相关信号量创建在同一个信号量组中,这样既便于逻辑上的清晰理解也便于管理。一个信号量必须属于一个信号量组,否则不能被系统所使用。信号量和信号量组,存储于内核系统区域,是随内核持续的,是不会被系统所自动清理的,所以当进程退出前,需要清理进程生成的那些信号量们。

    信号量可以包含一个增加或减小的值,用以指出什么资源正被访问和访问的次数。它是一个记数器,用于控制多进程对共享数据的存储。一旦成功拥有了一个信号量,对它所能做的只有2种:请求、释放。当执行释放操作时, 系统将把该信号值减1。如果小于0,那就还设为0。而当执行请求操作时,系统将把该信号值加1,如果该值大于设定的最大值,那么系统将挂起你的处理进程,直到其他进程释放到小于最大值为止,这样能够保证多个进程不会造成互锁。

    3.消息队列
  消息队列(MessageQueue)是一个结构化的排序内存段表,这个队列是进程存放或检索数据的地方,是一个消息的链表,可以被多个进程所共享,而不管这几个进程是否具有“亲缘”关系。每个消息队列都有一个队列头,用来描述该消息队列的大量信息,包括消息队列键值、用户ID、消息队列中消息数目等等,甚至记录了最近对消息队列读写进程的ID。

  消息可以看作一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读走消息。消息队列与信号量一样的,是随内核持续的,只有在内核重起或者显示删除一个消息队列时,该消息队列才会真正被删除。

    二、IPC在Tuxedo中的使用(目录)
  1. Tuxedo及核心子系统简介
  BEA Tuxedo是在企业、Internet这样的分布式运算环境中,开发和管理三层结构的客户/服务器型关键任务应用系统的强有力工具。它具备分布式事务处理和应用通信功能,并提供完善的各种服务来建立、运行和管理关键任务应用系统。它提供了一个开放的环境,支持各种各样的客户、数据库、网络、遗留系统和通讯方式,使得开发人员能够利用它建立跨硬件平台、数据库和操作系统的交互应用系统。

    Tuxedo的应用程序是以业务逻辑服务、由这些逻辑服务组织成的高层服务器组件和在服务器结点环境中的组件分布为特征的。支持这种虚拟主机环境的Tuxedo元素,包括配置信息库和实现运行时应用管理的核心子系统。限于篇幅的限制,这里只对核心子系统作简单介绍。

  1.1公告牌
  Tuxedo应用配置文件被映射到一个运行时数据结构:公告牌(BB)。BB 作为一个从配置文件中派生出来的共享信息库,驻留在每个参与到由配置文件指定的应用程序的Tuxedo的服务器结点上。BB不仅作为分布式应用的名字服务数据库,提供分布式环境下的应用对象的位置信息,还作为应用统计数据的运行时仓库。
BB由Tuxedo核心例程(对应用开发者透明)访问,由核心例程读/修改BB库。这个信息库提供Tuxedo完成动态客户/服务器映射所需的信息,同时也提供完成诸如负载平衡、 安全性和事务协调等功能的信息。

    1.2 事务管理器
  事务管理器既是Tuxedo 体系结构的中心,也是每个Tuxedo服务器的核心 ,提供重要的分布式应用服务、命名、 消息路由、 负载平衡、配置管理、事务管理和安全性。它也包含BB结构,使用维护和访问BB信息的服务。换句话说,BB内包含有执行和管理大规模的基于组件的应用程序所需的所有信息,它将对事务管理器进程起作用。

    图1显示了事务管理器的基本操作,客户请求 到达驻留在服务器上的客户代理进程 ,服务器通过注册参加到该应用中。作为客户方通讯的一部分,事务管理器访问BB,然后选择服务器,接着,服务器消息队列的地址被返回,客户方的请求被马上传送到合适的队列等待服务为它进行处理。

北京联动北方科技有限公司

图1: 事务管理器工作流程示意图

    1.3 工作站
  工作站把Tuxedo ATMI API扩展到客户应用程序中,使得平台透明化。使用ATMI的客户端程序,可以访问在Tuxedo分布式环境中任何地方的服务。

  一个多路网关进程,称为工作站处理进程(WSL),驻留在Tuxedo应用服务器上,配合Workstation Handler(WSH),处理工作站客户和事务管理器应用服务之间的通讯。工作站处理进程把来自大量客户应用程序的请求,会聚到Tuxedo事务管理器,以便完成所管辖的服务。

  1.4 服务器及其队列
  Tuxedo提供了一个简单的可选机制,用于给应用请求和回答进行进队和出队。 Tuxedo队列服务使下列应用变得可能:

工作流应用 提交和完成要求确保完成的事务 提交时间敏感型请求 与Tuxedo MIB和GUI的集成 出队请求的事务控制 利用简单的服务镜向和数据镜向进行软件容错

    2.影响Tuxedo IPC的系统参数
  在UNIX系统,Tuxedo大量使用IPC资源,然而通常系统默认的参数值远远低于Tuxedo应用程序的要求。因此,在安装Tuxedo应用程序前,必须合理地设置其参数值。这不仅决定应用程序能否正常操作,还将影响日后投入运行时的性能。

  以下就是系统V影响Tuxedo IPC资源的可调整系统参数。

  表1. 系统V IPC参数

     名字描述取值 共享内存 SHMMAX 单个共享内存段的最大尺寸(以字节为单位)越大越好,取决于可分配的系统内存 SHMSEG 一个进程可用的共享内存段的最大可用数目取决于可分配的系统内存 SHMMNI 系统范围内允许的共享内存段最多数目取决于可分配的系统内存 SHMMIN 单个共享内存段的最小尺寸(字节) 1 信号量 SEMMNS 系统范围的最大信号量数量至少需满足MAXACCESSERS-MAXWSCLIENTS+13 SEMMNI 可被创建的信号集的数目通常等于SEMMNS SEMMSL 每套信号集允许的最大信号量数量通常等于SEMMNS,因为Tuxedo不直接对信号集,但它对每个信号集分配尽可能多的信号量 SEMMAP 控制映射表里用于管理信号量的记录数量 SEMMNI+2 SEMMNU Undo 结构的数目Default 30 至少>SEMMNS SEMUME Undo 结构中记录数量 1 消息队列 MSGTQL 系统核心中能够存储的系统消息头的最大数量应足够大 MSGMNB 消息队列最大尺寸(字节)至少等于MSGMAX,当消息长度大于75%的MSGMNB时,消息将被存到文件中去,这将大大降低总体性能。 MSGMAX 每条消息的最大尺寸(字节)应足够大来处理应用程序的请求。 MSGSEG 系统拥有消息段数目取决于可分配的系统内存 MSGSSZ 每个消息段的尺寸(字节)一条消息可使用多个消息段,取决于可分配的系统内存 MSGMNI 最多可被创建的消息队列数目至少要大于MAXACCESSERS + 7 +(number of servers with REPLYQ) +(number of MSSQ sets) - (number of servers in MSSQ sets) MSGMAP 控制映射表里用于管理消息段的记录数量等于MSGSEG

    在程序开发的过程中,如果系统参数无法满足最小的要求,就会导致种种奇怪的问题。例如:

   (1)收到来自shmget的类似“Invalid argument” 这样的错误信息,那么很有可能是超过了当前共享内存SHMMAX的限制;

   (2)信号量集的最大数目SEMMNI以及系统范围内信号量的最大数目SEMMNS:超过这两个限制将返回ENOSPC错误。

  在消息队列参数中,MSGTQL,MSGMNB,MSGMAX,MSGSEG,MSGSSZ这五个参数将决定队列空间、队列个数、消息尺寸。

  从表1中,我们发现UBBCONFIG 文件中的参数:MAXACCESSERS,MAXWSCLIENT影响着IPC资源的使用情况。
  MAXACCESSERS: 在本系统的一个节点(一台服务器)上,同时可以访问公告板的进程数。它包括本地客户端进程、SERVER进程、WSL和WSH,但不包括管理进程如:BBL,DBBL等。

  MAXWSCLLINET:定义了需要在MAXACCESSERS专为远程客户端保留的记录数目。

  这就可以解释很多初学者遇到的问题,启动失败:因为系统默认的值没有符合最小要求。

    3.关于Tuxedo IPC资源的实验和观察
  为加深对IPC资源和Tuxedo的了解,笔者借助UNIX命令ipcs等对多个实验作出的观察。

  研究平台配置如下:
  操作系统:HP-UNIX 11i:
  数据库数目:Oracle, 3个
  服务程序:40个
  Service数目:1275种
  IPCKEY值:34268
  PERM值:0666
  客户端类型:Workstation Client
  编程接口:ATMI

  3.1 关于共享内存的实验

devt@/tuxedo/appdir> ipcs -am |grep tuxedo
IPC status from /dev/kmem as of Fri Oct 15 17:46:05 2004
Shared Memory:
T ID KEY MODE OWNER GROUP CREATOR CGROUP NATTCH SEGSZ CPID LPID ATIME DTIME CTIME
m 12311 0x000085dc --rw-rw-rw- tuxedo gtux tuxedo gtux 42 2835444 8041 2090 11:26:36 11:29:21 14:03:10
m 16408 0x00000000 --rw------- tuxedo gtux tuxedo gtux 2 352 8176 8325 14:04:16 no-entry 14:03:41
devt@/tuxedo/appdir> ps -efx |egrep "8041|2090"
tuxedo 8041 1 0 Oct 14 ? 0:04 BBL -C dom=KFX -g 30002 -i 0 -u devt -U /tuxedo/appdir/log/ULOG -m 0
-A
tuxedo 22733 1362 0 17:22:04 pts/tv 0:00 egrep 8041|2090
devt@/tuxedo/appdir> ps -efx |egrep "8176|8325"|grep ?v grep
tuxedo 8325 8176 0 Oct 14 ? 0:00 WSH -c 11 -d /dev/tcp -i 0 -s 16408 -p 2048 -P 65535
tuxedo 8176 1 0 Oct 14 ? 0:02 WSL -C dom=KFX -g 8 -i 705 -u devt -U /tuxedo/appdir/log/ULOG -m 0 -e
/tuxedo/appdir/log/WSL.err -o /tuxedo/appdir/log/WSL.out -A -r -- -d /dev/tcp -n //devt:5035
devt@/tuxedo/appdir> ps -ef |grep tuxedo |grep -v grep |grep 8176
tuxedo 8325 8176 0 Oct 14 ? 0:00 WSH -c 11 -d /dev/tcp -i 0 -s 16408 -p 2048 -P 65535
tuxedo 8176 1 0 Oct 14 ? 0:02 WSL -C dom=KFX -g 8 -i 705 -u devt -U /tuxedo/ap


  从上述实验中,不难观察到:

   (1)CPID指出了这两个共享内存的所有者是:公告牌和WSL进程。WSH并不创建共享内存。

   (2)LPID指出了最后一次访问WSL的共享内存段的是WSH。

   (3)共享内存Id不是固定得,每次由系统分配指定。但BB公告牌的共享内存的十六进制KEY值x000085dc 转换成十进制,就是UBBCONFIG中设定的IPCKEY值34268,

   (4)注意到公告牌和WSL进程的访问模式是不同的。BB的访问模式等于与UBBCONFIG中PERM的值0666。

  3.2关于信号量的实验

devt@/tuxedo/appdir> ipcs ?as |grep tuxedo |grep -v grep
IPC status from /dev/kmem as of Fri Oct 15 17:46:21 2004
T ID KEY MODE OWNER GROUP CREATOR CGROUP NSEMS OTIME CTIME
Semaphores:
s 60035 0x000085dc --ra-ra-ra- tuxedo gtux tuxedo gtux 3 17:49:50 14:03:10
s 140036 0x00000000 --ra-ra-ra- tuxedo gtux tuxedo gtux 816 no-entry 14:03:10


  从上述实验中,不难观察到:

   (1)有两个信号集,其中一个KEY值是公告牌的。

   (2)在两个信号集内,分别容纳了3和816个信号量。

   (3)最后一次对ID 为60035信号集中的信号量的操作时间是17:49:50。

  另从从创建的时间和访问模式都一样来推测,另一个信号集也是属于BB的。它们的具体作用有待进一步深入研究。

  3.3关于消息队列的实验
  3.3.1 实验1:关于应用程序的队列

devt@/tuxedo/appdir> ipcs ?aq |grep tuxedo |grep -v grep
IPC status from /dev/kmem as of Fri Oct 15 18:07:04 2004
T ID KEY MODE OWNER GROUP CREATOR CGROUP CBYTES QNUM QBYTES LSPID LRPID STIME RTIME CTIME
Message Queues:
q 12556 0x00000000 -Rrw-rw-rw- tuxedo gtux tuxedo gtux 0 0 1048560 8151 8325 13:54:27 13:54:27 14:04:16
q 10523 0x000085dc -Rrw-rw-rw- tuxedo gtux tuxedo gtux 0 0 1048560 8163 8041 16:48:06 16:48:06 14:03:13
q 6430 0x00000000 -Rrw-rw-rw- tuxedo gtux tuxedo gtux 0 0 1048560 8151 8043 13:54:21 13:54:21 14:03:13
q 6431 0x00000000 --rw-rw-rw- tuxedo gtux tuxedo gtux 0 0 1048560 8041 8042 14:03:13 14:03:13 14:03:13
q 4395 0x00000000 --rw-rw-rw- tuxedo gtux tuxedo gtux 0 0 1048560 8041 8050 14:03:15 14:03:15 14:03:15
q 2563 0x00000000 -Rrw-rw-rw- tuxedo gtux tuxedo gtux 0 0 1048560 8151 8162 10:48:07 10:48:07 14:03:36
……
q 6666 0x00000000 -Rrw-rw-rw- tuxedo gtux tuxedo gtux 0 0 1048560 8165 8172 14:16:36 14:16:36 14:03:39
q 2571 0x00000000 --rw-rw-rw- tuxedo gtux tuxedo gtux 0 0 1048560 8160 8172 14:16:36 14:16:36 14:03:39
q 2643 0x00000000 --rw-rw-rw- tuxedo gtux tuxedo gtux 0 0 1048560 0 0 no-entry no-entry 14:03:41


  *共70个队列,限于篇幅不一一列出

  从上述实验中,不难观察到:

   (1)对于多服务器单队列的服务器(MSSQ),都有一个队列用来接收请求,访问模式为--rw-rw-rw- 。另一个队列用来回复,访问模式为-Rrw-rw-rw-。

   (2)KEY值:只有一个是属于公告牌的(值为0x000085dc),其余都为0x00000000。

   (3)ipcs告诉我们更多关于消息队列的信息:所有者、创建者、创建者组别、消息队列字节数、正在排队的消息数、队列的最大字节容量、最近一次的发送者和接收者以及时间和创建时间。

   (4)另逐个shudown服务程序,经比较发现:对于每个资源上的事务管理器,每个进程都有自己独立的请求队列,但回复队列只有一个。

   3.3.2 实验2:关于tmadmin会话的队列

devt@/tuxedo/appdir/temp> ipcs -aq |grep tuxedo |wc -l
70
devt@/tuxedo/appdir/temp> ipcs -aq |grep tuxedo >ipcs_q_noclient.txt
#在另一个SHELL开了一个tmadmin进程
devt@/tuxedo/appdir/temp> ipcs -aq |grep tuxedo |wc -l
71
devt@/tuxedo/appdir/temp> ipcs -aq |grep tuxedo >ipcs_q_1client.txt
devt@/tuxedo/appdir/temp> diff ipcs_q_noclient.txt ipcs_q_1client.txt
1c1,2
< q 18700 0x000085dc -Rrw-rw-rw- tuxedo gtux tuxedo gtux 0 0 1048560 427 371 20:07:38 20:07:38 20:07:1
5
---
> q 24676 0x00000000 --rw-rw-rw- tuxedo gtux tuxedo gtux 0 0 1048560 371 14981 16:11:54 16:11:54 16:11:4
2
> q 18700 0x000085dc -Rrw-rw-rw- tuxedo gtux tuxedo gtux 0 0 1048560 14981 371 16:11:54 16:11:54 20:07:1
5
……
devt@/tuxedo/appdir/temp> grep 24676 ipcs_q_noclient.txt |wc -l
0
devt@/tuxedo/appdir/temp> ipcs -aq |grep tuxedo |wc -l
71
#退出tmadmin进程
devt@/tuxedo/appdir/temp> ipcs -aq |grep tuxedo |wc -l
70


  此实验告诉我们,针对每个新的tmadmin会话,Tuxedo都会为它创建一个新的消息队列。此实验中,ID为24676就是为tmadmin会话创建的。

  3.3.3 实验3:关于WSL/WSH的队列
  在本地Windows PC,开启一个远程客户端程序后。

devt@/tuxedo/appdir/temp> ipcs -aq |grep tuxedo |wc ?l
71
devt@/tuxedo/appdir/temp> tmadmin
> pclt
LMID User Name Client Name Time Status Bgn/Cmmt/Abrt
--------------- --------------- --------------- -------- ------- -------------
FX tuxedo WSH 0:04:28 IDLE 0/0/0
FX tuxedo tmadmin 0:00:01 IDLE 0/0/0
> quit
devt@/tuxedo/appdir/temp> ipcs -aq |grep tuxedo |wc -l
71
devt@/tuxedo/appdir/temp> ipcs -aq |grep tuxedo > pcs_q_feclient.txt
devt@/tuxedo/appdir/temp> diff ipcs_q_noclient.txt ipcs_q_feclient.txt
1c1,2
< q 18700 0x000085dc -Rrw-rw-rw- tuxedo gtux tuxedo gtux 0 0 1048560 427 371 20:07:38 20:07:38 20:07:1
5
---
> q 26724 0x00000000 -Rrw-rw-rw- tuxedo gtux tuxedo gtux 0 0 1048560 414 15288 16:21:27 16:21:27 16:21:0
8
> q 18700 0x000085dc -Rrw-rw-rw- tuxedo gtux tuxedo gtux 0 0 1048560 15133 371 16:16:32 16:16:32 20:07:1
5


  此实验告诉我们,除了WSL本身有自己的回复队列,针对每个新的WSH,Tuxedo都会为它创建一个新的回复消息队列。此实验中,WSH的消息队列ID为24724。因为在0个远程客户端接入之前,WSL是不会自动启动WSH。
在这之后的另一个实验是将WSL关闭之后,发现WSL和WSH的消息队列同时,跟着进程的关闭而关闭。

    3.4 关于PERM的实验
  上述3个实验中,UBBCONFIG中*RESOURCES段的PERM值为0666,*SERVERS段的RQPERM和RPPERM均为0666。
将*RESOURCES段的PERM改为将PERM 设为0660后,重新创建TUXCONFIG。

devt@/tuxedo/appdir/log> ipcs -as|grep tuxedo
s 80035 0x000085dc --ra-ra---- tuxedo gtux tuxedo gtux 3 19:58:13 19:51:10
s 180036 0x00000000 --ra-ra---- tuxedo gtux tuxedo gtux 816 no-entry 19:51:10
devt@/tuxedo/appdir/log> ipcs -am|grep tuxedo
m 16407 0x000085dc --rw-rw---- tuxedo gtux tuxedo gtux 43 2835444 28873 28932 19:51:53 no-entry 19:51:10
m 20504 0x00000000 --rw------- tuxedo gtux tuxedo gtux 1 352 28922 28922 19:51:39 no-entry 19:51:39


  从此实验中,观察到除了*SERVERS段中另有制定访问模式外,共享内存和信号量均使用*RESOURCES中的PERM值。

  4. 关于ATMI的理解
  Tuxedo提供了一个基于C语言的编程接口,即应用程序事务监控接口ATMI,这套接口使得创建Tuxedo的客户程序与在C和C++编程语言中创建其它应用程序一样容易,方便了开发客户程序和服务程序。

   4.1 ATMI简介
    4.1.1 客户程序的任务

  客户程序一般执行如下任务:

   ⑴. 调用tpchkauth()决定加入一个应用程序所需的安全级别。

   ⑵. 调用tpinit()来连接到一个Tuxedo应用程序,所需的安全信息作为tpinit()的参数传给了应用程序;

   ⑶. 执行服务请求;

   调用tpterm()来断开和Tuxedo应用程序的连接。

北京联动北方科技有限公司

图2: 客户程序的工作流程

    4.1.2 服务程序的任务
  尽管开发者使用ATMI编程接口来创建Tuxedo客户程序和服务程序,但服务程序不全部由开发者来编写,开发者只需写一些称为服务的商业逻辑函数,然后和Tuxedo的一些二进制程序,联合编译成一个可执行的服务程序。其任务包括:

   ⑴. 在Tuxedo服务程序启动时,执行tpsvrinit()函数,可以在里面打开一些如数据库之类的资源供以后使用;

   ⑵. 在Tuxedo服务程序关闭时,执行tpsvrdone()函数,可以在里面关闭tpsvrinit()中打开的资料;

   ⑶. Tuxedo服务程序以服务的形式来响应客户程序的请求,客户程序不是通过名字来调用服务程序的,而是调用服务,客户程序不知道处理它请求的服务程序的位置;

   服务程序调用tpreturn()函数来结束服务请求,并返回一个缓冲区,必要时,将它传给客户程序;

北京联动北方科技有限公司

图3: 服务程序的工作流程

    4.1.3 类型缓冲区
  在Tuxedo系统中的所有通信过程都是通过类型缓冲区来完成的,Tuxedo系统提供了大量的类型缓冲区来供开发者使用。所有类型缓冲区都必须通过Tuxedo的tpalloc(), tprealloc(), tpfree()这些ATMI来分配回收,它们都有特定的头部。

  4.1.4 通信模式
  在和客户端程序的通信过程中,Tuxedo系统提供多达9种的多种通信模式,其中包括基于队列的通信和基于事务的通信。

    4.1.5 事务
  要使用事务,应用程序开发者需要使用如下ATMI函数:

   ⑴. tpbegin(),用于开始一个事务;

   ⑵. tpcommit(),开始一个二阶段提交处理;

   ⑶. tpabort(),产即终止事务。

  在下面的例子中,客户程序打开了一个事务,请求了两个服务,并且提交了事务。因为服务请求是在事务开始和提交之间完成的,所以两个服务的行为都被了事务记录。

北京联动北方科技有限公司

图4: 事务流程图

    4.2 对ATMI的理解
  从上面对ATMI的简介,笔者认为Tuxedo通过ATMI,实质上是对IPC资源本身API的再次封装,从而提供了更高一层的API以建立分布式应用组件,包括服务程序、客户程序和事务管理器等。这些组件在执行时以消息相互通讯,由Tuxedo的内部服务机制统一管理。这些服务机制实现了复杂的分布式事务控制和广泛的分布式应用管理。而在通信过程中,所有的过程都是通过类型缓冲区来完成的。这实际上就是对消息队列的操作,从而获得相应的IPC资源。

  统一定义的类型缓冲区、更高一层的API,使得它们在跨越不同网络、不同协议、不同CPU构架以及不同操作系统之间,得到统一的处理。在加上编译程序builderserver和builderclient的再次封装,开发者在分布式计算环境中,完全可以有效地避开了异构网络和异构计算机系统带来的差异,而把精力集中在商业逻辑的开发上。通过调用ATMI的API,开发基于ATMI的客户端程序,编写普通的c程序相当。

  理解了这些含义,我们可以理直气壮地说:ATMI已经超越了字面上“监控接口”的含义,它是一种高度封装的Tuxedo 应用编程接口。它是一个真正的事务处理和消息传递中间件。下图有助于我们更好地理解整个体系架构。

北京联动北方科技有限公司

图5: Tuxedo体系架构

    5. Tuxedo与IPC的关系
  从上文对IPC资源的介绍中,我们知道了Tuxedo应用程序的工作原理。然而这些底层技术的背后,是离不开复杂的数据结构和API。下表是笔者将IPC资源及其数据结构和API、核心系统参数、ATMI函数,按照IPC资源类别制作的一个列表,以更清楚地将它们的关系呈现出来。

  表2. Tuxedo与IPC资源关系列表

IPC资源 IPC主要数据结构主要IPC API 相关核
心参数相关的ATMI 函数 共享内存 shmid_kernel结构;
dentry,inode结构 shmget:用来获得共享内存区域的ID,如果不存在指定的共享区域就创建相应的区域。
shmat:把共享内存区域映射到调用进程的地址空间中去。
shmdt:解除进程对共享内存区域的映射。
shmctl:实现对共享内存区域的控制操作。 SHMMAX

SHMSEG
SHMMNI
SHMMIN


动态
广播 tpadvertisetpunadvertise 信号量 struct ipc_ids sem_ids:系统中记录信号量的数据结构,位于内核中,系统中的所有信号量都可以在结构sem_ids中找到访问入口。系统中的每一个信号量集都对应一个struct sem_array结构,该结构记录了信号量集的各种信息,存在于系统空间。 semget:创建一个新的信号量组或获取一个已经存在的信号量组。
semop:可以一次对一个或多个信号量进行操作。
semctl:该函数可以用来获取一些信号量的使用信息或者是来对信号量进行控制。

SEMMNS
SEMMNI
SEMMSL
SEMMAP
SEMMNU


SEMUME   消息队列结构msg_queue:用来描述消息队列头,存在于系统空间:
结构msqid_ds:用来设置或返回消息队列的信息,存在于用户空间;
结构kern_ipc_perm:内核中记录消息队列的全局数据结构,msg_ids能够访问到该结构;
结构(struct ipc_ids msg_ids): 系统中记录消息队列的,位于内核中,系统中的所有消息队列都可以在结构msg_ids中找到访问入口。
msgget: 返回与健值key相对应的消息队列描述字。

msgrcv:


从msgid代表的消息队列中读取一个消息。
msgsnd:向msgid代表的消息队列发送一个消息,即将发送的消息存储在msgbuf结构中,消息的大小由msgze指定。对发送消息来说,有意义的msgflg标志为IPC_NOWAIT,指明在消息队列没有足够空间容纳要发送的消息时,msgsnd是否等待。

msgctl:


该系统调用对由msqid标识的消息队列执行cmd操作,共有三种cmd操作:获取消息队列信息、设置消息队列的属性、删除msqid标识的消息队列;

MSGMNB
MSGMAX
MSGTQL
MSGSEG


MSGSSZ 缓冲
区管理 tpalloctprealloctpfreetptypes 消息优先级别管理 tpgpriotpsprio 可靠排队管理 tpenqueuetpdequeue

    透过上表的总结和上文对IPC资源、ATMI的分析,可以看到Tuxedo和IPC密不可分。在应用程序启动时,Tuxedo就会检查系统的信号量配置。如果值不符合要求,就会导致启动失败。应用程序在运行时,也大量用到IPC资源,包括信号灯,消息队列及共享内存,充分利用了直接调用IPC资源的灵活性,从而实现其强大功能。另一方面ATMI则使编程变得更透明,开发人员只需注重在商业逻辑的实现。




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论