ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C#-WCF服务依赖项

2019-10-31 08:08:21  阅读:169  来源: 互联网

标签:soa wcf c


我分别具有三个wcf服务A,B和C,因为我希望它成为SOA(面向服务的体系结构),所以我的设置工作的方式是从客户端向服务器发送请求时.

>所有服务都是自托管的Windows服务.
>客户端向服务A发送请求(客户端不了解其他服务B和C);
>服务A最终将该请求发送到服务B和服务C.
服务B和C将响应发送回服务A,服务A将响应发送回客户端.

我面临的问题:如果我在服务B的代码中进行了任何更改,然后重新生成并重新启动服务,则在返回响应时会遇到问题,但是当我重新启动所有其余的服务时,它将可以正常工作.

换句话说,即使我只更改了一个服务中的代码并重新构建它,除非我重新启动所有服务(A,B和C),否则我的客户端不会获得响应,我知道如果我重新启动所有服务,事情就可以了三个服务,但我想知道这是我设计方式中的问题,还是我必须处理自托管Windows服务的问题.而且所有服务(A,B,C)都是独立的,因为彼此之间不依赖.

有没有人看到SOA中发生过这样的事情.如果有人可以指导我找到适当的解决方案,我会感到高兴吗?

解决方法:

>用任何种类的队列替换服务之间的WCF(一个服务发布内容,其他服务准备就绪时可以读取).可以是任何东西.可以是一个简单的表,如果有新内容可以从中读取.可以是RabbitMQ,NServiceBus等,任何适合您的方法.
>定义您放入队列中的消息:命令和事件.两者都是带有属性的简单类,那里没有逻辑.命令表示系统被要求执行的操作(RegisterUser,PlaceOrder等),事件表示系统已执行的操作(UserRegistered,OrderApproved,PaymentReceived等).要明确说明操作,请勿执行“我已更改了客户端上用户的所有属性,现在我称为SaveUser(user)”之类的操作.您的服务假设知道如何更改对象,客户端应仅命令做什么.
>永不违约.这比听起来容易,容易:您可以在消息合同中添加内容,但不能删除.换句话说,您只需保持合同向后兼容即可.

现在您有了一个更好的设计:服务仅通过队列中的消息进行通信,消息是向后兼容的.这意味着您可以随时停止任何服务而不会影响其他服务:它们将继续将消息发送到队列中,并且当停止的服务再次返回时,它将赶上处理队列中所有内容的过程.

然后,如果需要,可以对客户端交互使用相同的方法:如果不调用WCF,客户端只会将其命令放在某种队列中,则服务升级或其他停机时间不会影响用户体验.

例如:如果我使用WCF下订单或将物品放入购物卡,则如果有问题或服务需要维修,我将无法做到.我会点击一个按钮,然后出现一个令人讨厌的错误.更重要的是,我的订单不会纳入系统.
相反,如果中间有一个队列,则仅将命令放入队列.现在,即使我的服务此刻处于关闭状态,或经历了很高的负载(因此也很慢),我的用户体验仍然是相同的,并且不会降低.只是我的命令会在稍后处理,但是作为客户端,我并不在乎.在这种情况下,我的订单不会丢失.系统变得容错且自平衡.

如果您只是在中间放置一个队列,而不是遇到WCF附带的时空耦合问题,则可以采取各种奇妙的技巧:)
而我所描述的仅仅是开始…

标签:soa,wcf,c
来源: https://codeday.me/bug/20191031/1974217.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有