服务端的2个Service

1. HandleService: 从Redis中获取异常信息, 入库并发送通知到相关责任人。 
2. HealthyCheckService: 对站点指定页面进行模拟访问, 如果请求成功或者返回的内容是约定的内容就表示正常, 否则就会产生一个异常信息, 并发送到http服务端。 
 

HandleService

HandleService 的处理流程包括1. 从Redis中获取数据 2. 信息持久化到数据库 3. 更新DB中的状态 4 删除Redis中的数据
 public void Handle()
{
ThreadPool.SetMaxThreads(, ); //设置线程
while (true)
{
string errorEntityId = RedisHelper.DequeueItemFromList("ErrorEntityQueue"); //从Redis中获取数据
if (!string.IsNullOrEmpty(errorEntityId))
{
ThreadPool.QueueUserWorkItem(state =>
{
try
{
//0. 从Redis中获取数据
var errorEntityDto = RedisHelper.Get<ErrorEntityDto>(errorEntityId);
//1. 信息持久到DB, 方便后续查看,统计
ErrorEntity errorEntity = null;
errorEntity = Mapper.Map<ErrorEntity>(errorEntityDto);
errorEntity.NotifyStatus = ; //未通知
_errorEntityBusiness.Insert(errorEntity, false);
//2. 通知到相关责任人
bool issuccess = Notity(errorEntityDto);
if (issuccess)
{
//3. 更新DB中的状态
_errorEntityBusiness.UpdateBySql(string.Format("set NotifyStatus = 1 where Id='{0}'", errorEntity.Id));
}
//4. 删除redis中的数据
RedisHelper.Del(errorEntityId);
}
catch (Exception exception)
{
LogHelper.Error("处理发生异常", exception);
}
//todo 这里应该以有个补救措施, 如果通知失败。 应该再另外一个job中对这些失败的通知重新发送。这里就不写了
}, errorEntityId);
}
else
{
Thread.Sleep(); //如果没有取到数据,则暂停5s
}
}
}
关于第二步,发送通知, 因为我们会给每个网站配置一个Token , 在上传异常信息的时候, Token会随信息一起上传, 所以在这里, 我们可以根据Token来查找到对应的站点信息, 站点信息中包含有责任人信息, 所以我们就可以找到对应责任人。
 

HealthyCheckService

主要逻辑就是迭代所有站点,并迭代该站点下所有的服务器, 对每个服务器通过模拟请求检查站点是否正常, 关于判断是否正常, 有两种方案,
1. 判断站点返回的http响应码是多少, 如果是200就表示正常。 
2. 判断站点返回的内容是什么, 如果是“OK"或者"success"就表示正常。 
对于第一种方案, 页面可以是一个普通的页面, 但是对于第二种情况, 我们需要新开发一个页面, 可以在这个页面内对所依赖服务或者环境的检测, 如果检测通过就返回“ok”表示正常。。 比如系统依赖数据库和A服务, 那在这个页面中就尝试连接和读取数据库信息和A服务, 注意这些检查操作都应该是“无影响”的, 比如对数据库的操作应该是select操作, 而不应该是insert 或者update操作。 
private  void Handle()
{
//获取所有的网站, 依次检查返回的是否为ok, 或者检查http.status=200
IEnumerable<WebSite> webSites= _webSiteBusiness.GetList("select * from WebSite where Enable = 1");
Parallel.ForEach(webSites, website =>
{
IEnumerable<WebServer> webServers =
_webServerBusiness.GetList(
(string.Format("select * from WebServer where Enable = 1 and WebId={0}", website.Id)));
Parallel.ForEach(webServers, webserver =>
{
//这里如果你仅仅想获取状态码, 可以调用 HttpHelper.GetHttpStatus方法
var responseText= HttpHelper.SendGetRequest("http://" + webserver.ServerIp + website.CheckUrl, website.Host, website.Host, ,
Encoding.UTF8);
if (responseText != "ok")
{
//站点出了异常,需要发送到服务端进行处理
ClientErrorEntity clientErrorEntity = new ClientErrorEntity();
clientErrorEntity.ExceptionMessage = website.WebName + "(" + "http://" + webserver.ServerIp + website.CheckUrl + ")" + "访问发生异常,异常信息如下:" + responseText;
clientErrorEntity.Ip = webserver.ServerIp;
clientErrorEntity.RequestUrl = "http://" + webserver.ServerIp + website.CheckUrl;
clientErrorEntity.Type = ;
ClientErrorEntity.WebToken = website.WebToken; //重新设置Token
SendErrorEntity.SendError(clientErrorEntity);
}
});
});
}

.Net分布式异常报警系统-服务端Service的更多相关文章

  1. .Net分布式异常报警系统-服务端站点管理

    管理站点 对于管理站点, 并没有太复杂的内容, 主要就是对数据库表中的数据进行维护.  管理的实体有3个 WebSite(站点信息), WebService(站点服务器信息), ErrorEntity ...

  2. .Net分布式异常报警系统-客户端及服务端API

    客户端 客户端的作用就是捕获未处理异常, 发送异常到服务端. 关于捕获未处理异常的方法参考 http://www.cnblogs.com/youring2/archive/2012/04/25/246 ...

  3. .Net分布式异常报警系统-简介

    系统简介 分布式异常报警系统就是收集系统运行过程中产生的未处理异常,检查系统运行的状态,并将异常信息统一发送到服务端,由服务端将信息通知到相关的责任人.  问题 我们在项目开发中可能遇到以下几个问题: ...

  4. XFire构建服务端Service的两种方式(转)

    XFire构建服务端service的两种方式,一是用xfire构建,二是和spring集成构建. 一,xifre构建,确保把xfire的jar包导入到工程中或classpath. 1,service的 ...

  5. XFire构建服务端Service的两种方式

    1.原声构建: 2.集成spring构建 http://blog.csdn.net/carefree31441/article/details/4000436XFire构建服务端Service的两种方 ...

  6. .Net分布式异常报警系统-项目介绍

    后台管理  首页统计的是当天每个时段的异常数量, 使用的是echarts组件, 红框所示, 可以选择不同的系统进行查看.     得益于echarts的强大功能, 你可以使用柱状图来查看.     站 ...

  7. 分布式监控CAT服务端的本地部署

    一.CAT简介 CAT(Central Application Tracking),是美团点评基于 Java 开发的一套开源的分布式实时监控系统.美团点评基础架构部希望在基础存储.高性能通信.大规模在 ...

  8. 【分布式】Zookeeper服务端启动

    一.前言 前面已经了解了Zookeeper会话相关知识点,接着来学习Zookeeper服务端相关细节. 二.服务端 服务端整体架构如下 Zookeeper服务器的启动,大致可以分为以下五个步骤 1. ...

  9. java.net.SocketException:Software caused connection abort: recv failed 异常分析 +socket客户端&服务端代码

    java.net.SocketException:Software caused connection abort: recv failed 异常分析 分类: 很多的技术 2012-01-04 12: ...

随机推荐

  1. 用批处理来自动化项目编译及部署(附Demo)

    阅读目录 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 介绍 详细 处理 结论 Demo下载 介绍 一个项目从立项开始,可能就已经根据公司的配置模板将 ...

  2. 小说一下case ~

    case 这个关键词,用的地方不少~大部分的用途都通过以下的方式去应用 SELECT CASE @i END AS 测试1; 测试1 ----------- DECLARE @Hour INT = D ...

  3. 解决"is marked as crashed and should be repaired"方法

    初次遇到这个问题是在服务器上放置mysql的磁盘空间满了(数据库目录和网站目录一定要做一定的分离,不要放在一个磁盘空间了) 当请求写入数据库时,php会提示 **** is marked as cra ...

  4. 【转】input输入框中光标高度的变化问题

    原文地址:http://blog.csdn.net/luochao_tj/article/details/17755457 input[type='text']文本框光标高度在有输入内容和为空时发生很 ...

  5. SVN服务器&客户端的搭建和使用

    目录结构: 1. SVN服务器搭建和使用-VisualSVNServer 2. SVN客户端安装和使用-TortoiseSVN 3. TortoiseSVN使用方法 SVN简介 SVN是Subvers ...

  6. 如何用ZBrush做人体造型雕刻

    之前我们用ZBrush®中的Curves和Insert笔刷快速创建模型的躯干.四肢以及手指.经过老师耐心的讲解我们也收获了很多,知道了创建模型的流程和雕刻技巧.今天的ZBrush教程将结合一些新的雕刻 ...

  7. [转]ExtJs4 笔记(13) Ext.menu.Menu 菜单、Ext.draw.Component 绘图、Ext.resizer.Resizer 大小变更

    作者:李盼(Lipan)出处:[Lipan] (http://www.cnblogs.com/lipan/)版权声明:本文的版权归作者与博客园共有.转载时须注明本文的详细链接,否则作者将保留追究其法律 ...

  8. 利用注解进行sql反射代码示例

    @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface Table { String val ...

  9. KEngine策划指南:配置表格的编辑与编译

    策划与程序的桥梁 执行策划在游戏开发的过程中的主要工作是什么?当然就是和Excel打交道了.大量的Excel数据表,最终会被演变成游戏的配置数据.日常游戏开发中,策划编辑配置表一般有两种方式: 编译式 ...

  10. Unity3D所使用的第三方工具

    前言 最近在研究Unity3D的结构和原理.关于Unity3D怎么用之类的教程在网上一找一大堆,想看教程之类的就不用看这篇文章了.我想做的是从使用Unity3D所看到的表象(表),摸透其设计原则和组织 ...