存在主义的问题,似乎只提供了两个相等但可行的选择
我们第一次在分布式环境(典型的云应用环境)中面对这样的问题,我们很难找到"正确"的答案……嗯,第二次呢?实际的问题是,云翌通信,我们不能仅凭定义就给出一个普遍的解决办法,而必须每次都逐案处理。这样的场景可能是在两个遗留系统或第三方系统之间、遗留系统和我们的自定义扩展之间传输数据,甚至在我们可能拥有的不同扩展应用程序之间传输数据。可能存在不同的边界条件,这主要取决于源系统和目标系统的外部通信能力。有时,可能需要额外的中间组件来处理系统之间的集成。因此,我们需要深入研究给定场景、角色和组件的优缺点,并为可以使用的架构模式做出具体的有意识的决策。我们还必须考虑诸如远程系统之间直接同步调用的性能、源系统本身的可伸缩性、缺乏针对我们全新用例的定制接口、保留安全模型(例如身份传播)、需要初步缓存和其他非功能性需求等方面,我们通常会达到众所周知的情况(服用红色药丸后)当–"已经做出了选择,现在你必须理解它"
完美的解决方案无疑是完全避免分布式环境,从而扩展现有的业务系统。不幸的是,没有那么多技术平台像Dirigible那样为"系统内编程"提供成熟的开发环境。也没有那么多人已经内置或捆绑飞艇。…世界还不是完美的…还没有。如果你已经排除了你的场景中所有的易赢选项,剩下的只有一个选项——复制,那么自然的问题是——让我猜猜——"在这种情况下,飞艇还能帮我什么?"正确的?好吧,让我们看看……
复制场景的简化视图将由两方组成,它们必须相互传输数据。让我们首先回答这个问题:源系统是否有可能成为主动方,即使用"推"通信模式?如果推送模式是可能的,那么您可能会更喜欢它;因此,让我们看看在云应用程序端需要做什么。
要实现推送案例,我们将执行以下操作:
场景细节:
1。创建一个空白项目
2。为员工创建数据结构
sfrepl_雇员.table
{
"tableName":"SFREPL\u EMPLOYEES",
"columns":
[
{
"name":"EMPLOYEE\u ID",
"type":"INTEGER",
"length":",
"notNull":"true",
"primaryKey":"true",
"defaultValue":"
}
,
{
"name":"EXTERNAL\u ID",
"type":"VARCHAR",
"length":"128〃,
"notNull":"true"、
"primaryKey":"false"、
"defaultValue":"
}
、
{
"name":"FIRST\u name"、
"type":"VARCHAR"、
"length":"40〃、
"notNull":"false"、
"primaryKey":"false"、
"defaultValue":"
}
、
{
name":"LAST\u name"、
"type":"VARCHAR"、"length":"40〃、
"notNull":"false"、
"primaryKey":"false"、
"defaultValue":"
}
,
{
"name":"REPLICATION\u ID",
"type":"INTEGER",企业软件服务,
"length":"0〃,
"notNull":"false",
"primaryKey":"false",
"defaultValue":"
}
]
}
3。创建实体服务
4。选择"表上实体服务"和…
5。…选择"SFREPL\ U员工"表
6。给出名称,例如"雇员\实体"_服务.js"
7. 激活并发布项目
8。在工作区资源管理器
9中查找并选择服务。从预览
10中获取"public"URL。使用您选择的RESTClient发送测试后请求
11。您可以在数据库透视图中通过SQL控制台检查实际插入
如果我们不能使用上面的推送通信模式,我们必须激活云应用程序方。这可以通过安排一个后台作业来实现,该作业将触发一个服务,该服务将在给定的时间段内从外部/后端系统"拉"出所需的数据。Dirigible内置了一个基于ApacheCamel的微型ESB。与Camel一般支持的用例和eip相比,它支持的用例和eip数量有限。幸运的是,这个用例得到了飞船内置ESB的支持。
场景细节:
1。按照上面
2的步骤,从员工中创建一个空白项目和一个表格。为员工和复制会话创建数据结构
sfrepl_会话.表
{
"tableName":"SFREPL\u SESSIONS",
"columns":
[
{
"name":"SESSION\u ID",
"type":"INTEGER",
"length":"0〃,
"notNull":"true",
"primaryKey":"true",
"defaultValue":"
}
,
{
"name":"SESSION\u type",
"type":"VARCHAR,
"length":"64〃,
"notNull":"true",
"primaryKey":"false",
"defaultValue":"
}
,
{
"name":"SESSION\u STARTED",
"type":"TIMESTAMP",
"length":"0〃,
"notNull":"true",
"primaryKey":"false",
"defaultValue":"
}
,
{
"name":"SESSION u FINISHED",
"type":"TIMESTAMP",
"length":"0〃,
"notNull":"false",
"primaryKey":"false",
"defaultValue":"
}
,
{
"name":"SESSION\u STATUS",
"type":"INTEGER",
"length":"0〃,
"notNull":"true",
"primaryKey":"false",
"defaultValue":"
}
,
{
"name":"SESSION\u DESC",
"type":"VARCHAR",
"length":"128〃,
"notNull":"false",
"primaryKey":"false",
"defaultValue":"
}
]
}
3。启动项目
4。创建集成服务
生成的服务应如下所示:
它使用标准计时器功能。对于我们的例子,我们更喜欢使用Quartz job来利用cron表达式。因此,返利购物,将源代码替换为以下内容:
/sfrepl/sfrepl_用户.js
其中:
*表达式"0+0+0+*+*+*+?"表示作业将在每午夜触发。
*/sfrepl/sfrepl_用户.js–是要执行的服务的路径
5。现在创建实际服务
源代码如下:
var systemLib=require('system');
var odata_dest=require('sfrepl/odata_dest');
var odata_call=require('sfrepl/odata_call');
var repl_manager=require('sfrepl/replication_manager');
var employees=require('sfrepl/replication_employees');
try{
var replId=repl_经理.start复制("用户");
var replicatedCount=0;
if(replId>0){
try{
var destinationproperties=odata_目的地getODataDest();
var url=DestinationProperties.get获取("URL");
var user=DestinationProperties.get获取("用户");
var密码=DestinationProperties.get获取("密码");
var data=odata_呼叫callOData(url+"用户?$select=userId,username,firstName,大数据分析软件有哪些,lastName",user,password);
var inserted=0;
var updated=0;
var failed=0;
try{
for(var i in data.d.results){
if(data.d.results[i].userId!==空){
如果(employees.find\u员工意识(data.d.results[i].userId)==null{
var id=employees.create\员工(
data.d.results[i].userId,
data.d.results[i].firstName,
data.d.results[i].lastName,
replId);
if(id!==null){
插入++;
}否则{
失败++;
系统库打印("复制条目时出错:"+JSON.stringify文件(data.d.results[i]);
}
}否则{
var id=employees.update\u员工(
data.d.results[i].userId,
data.d.results[i].firstName,
data.d.results[i].lastName,
replId);
if(id!==null){
更新++;
}否则{
失败++;
系统库打印("复制条目时出错:"+JSON.stringify文件(data.d.results[i]);
}
}
}
}
}
}渔获物(e){
系统库打印("复制错误:"+e.message);
repl_管理器.failReplication(replId,e.message);
}最后{
employees.purgeu员工(回复);
}
}捕获(e){
系统库打印("获取目标参数时出错:"+e.message);
repl_管理器.failReplication(replId,物联网网关,e.message);
}最后{
var msg="复制:"+(插入+更新+失败)+"。插入:"+插入+"。更新:"+更新+"。失败:"+失败+";
系统库打印("复制ID:"+replId+""+msg);
repl_管理器.finishReplication(replId,msg);
}
}
}catch(e){
系统库打印("检查活动复制会话时出错:"+e.message);
}
库模块为:
odata_目标jslib
导出.getODataDest=函数(){
varctx=新javax.naming.InitialContext();
var配置=ctx.查找("java:comp/env/connectivity配置");
var destinationConfiguration=配置.getConfiguration("sfodata");
var destinationproperties=destInation配置.getAllProperties();
返回目的地属性;
};