在不同服务器上部署相同的控制台程序P,怎样才能让它们不打架呢?

sound02 2012-09-26 03:37:31
为了加快处理的速度,我可能要部署很多个程序到不同的服务器上。
这些程序都是从数据库中取任务(一条数据是一个任务),做完相关的任务后更新任务的状态。

DataBase tablename column type length Default or is NULL
StatusData WallETaskInfomation AutoId bigint identity NO
StatusData WallETaskInfomation TaskFileName varhcar 50 NO
StatusData WallETaskInfomation Status varchar 10 NO
StatusData WallETaskInfomation UserId int NO
StatusData WallETaskInfomation UserName varhcar 50 NO
StatusData WallETaskInfomation StartTime smalldatetime NO
StatusData WallETaskInfomation FinishTime smalldatetime NO
StatusData WallETaskInfomation LastUpdate smalldatetime getdate()
StatusData WallETaskInfomation ProcessingProgram Varchar 50
比如程序有p1~p20 要保证P1 正在处理的任务,其他的程序P2~P20不会去处理。P1如果这个程序死掉了 它的任务可以重新被
P1~P20处理。
并且P1~P20 只是一套程序。


...全文
122 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
sound02 2012-09-26
  • 打赏
  • 举报
回复
不过你的建议还是蛮好的,多谢帮忙。[Quote=引用 8 楼 的回复:]

我只是打个比方而已,这样虽然比较粗糙但实现简单。
你也可以加个控制服务,它来做计划安排,任何子服务在挂掉后可以通过各种监控机制及时返回给控制端由它来重新派发计划。
[/Quote]
ViewStates 2012-09-26
  • 打赏
  • 举报
回复
我只是打个比方而已,这样虽然比较粗糙但实现简单。
你也可以加个控制服务,它来做计划安排,任何子服务在挂掉后可以通过各种监控机制及时返回给控制端由它来重新派发计划。
sound02 2012-09-26
  • 打赏
  • 举报
回复
你那个是如果一个任务失败后,要等一个小时才处理?[Quote=引用 6 楼 的回复:]

有做过,实现类似。速度这个很容易通过添加硬件解决,但是可能需要考虑其他情况,比如需要有个较好的算法来获取接下来应该执行哪条(非FIFO方式,业务需求的)
[/Quote]
ViewStates 2012-09-26
  • 打赏
  • 举报
回复
有做过,实现类似。速度这个很容易通过添加硬件解决,但是可能需要考虑其他情况,比如需要有个较好的算法来获取接下来应该执行哪条(非FIFO方式,业务需求的)
sound02 2012-09-26
  • 打赏
  • 举报
回复

多谢啊,你们是否有做过这样的项目,效果是不是很好(处理任务的速度)
[Quote=引用 3 楼 的回复:]

将数据库做状态机,不同程序去抢执行权
begin tran
declare @id bigint
select @id=(select top 1 autoid from tb
where
status='未开始状态'
or (starttime>dateadd(hh,-1,getdate()) and status='执行中状态') --'P1如果这个程序死掉了的情况'
ord……
[/Quote]
sound02 2012-09-26
  • 打赏
  • 举报
回复
还有我们现在又做成一个一个服务,服务中有一个queue ,每个程序从这个Queue 里面取任务,每隔半小时更新这个Queue。
ViewStates 2012-09-26
  • 打赏
  • 举报
回复
将数据库做状态机,不同程序去抢执行权
begin tran
declare @id bigint
select @id=(select top 1 autoid from tb
where
status='未开始状态'
or (starttime>dateadd(hh,-1,getdate()) and status='执行中状态') --'P1如果这个程序死掉了的情况'
order by lastupdate desc)
update tb set StartTime =getdate(),status='执行中状态' where autoid=@id
select * from tb where autoid=@id
commit
sound02 2012-09-26
  • 打赏
  • 举报
回复
我也想过这样的办法,比如我部署20个程序,就对Auto 对20去余 来分配到底是哪个程序处理。但感觉很不专业啊
并且我们产品中都有这样的处理程序。 大家有没有更好的处理方法呢
bdmh 2012-09-26
  • 打赏
  • 举报
回复
我觉得你可以通过配置来让每一个控制台程序区负责处理不同区间的数据,比如机器1处理1-100条,机器2 处理101-200条,这样肯定不冲突

109,881

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧