如何解决分布式日志exceptionless的写入瓶颈

我们都知道在分布式日志当中,exceptionless客户端是把日志写到

Elasticsearch数据库,就像我们把数据写入到关系数据库一样;

既然是写入,那么在短时间大数据量的情况下,写入就会涉及到效率的问题;

首先我们看下 exceptionless源码

public class InMemoryObjectStorage : IObjectStorage {private readonly Dictionary<string, Tuple<ObjectInfo, object>> _storage = new Dictionary<string, Tuple<ObjectInfo, object>>(StringComparer.OrdinalIgnoreCase);private readonly object _lock = new object();public InMemoryObjectStorage() : this(1000) {}public InMemoryObjectStorage(int maxObjects) {MaxObjects = maxObjects;}public long MaxObjects { get; set; }public int Count {get { return _storage.Count; }}

我们写入到日志的方法  ,首先会把日志写到内存当中;但是为了防止日志过大,导致服务器的内存被过度消耗的问题 ,这边是限制了 日志的条数的 1000;

当有新的日志进来时,如果是超过1000,那么旧的日志是会被抛弃的;

public bool SaveObject<T>(string path, T value) where T : class {if (String.IsNullOrWhiteSpace(path))throw new ArgumentNullException("path");lock (_lock) {_storage[path] = Tuple.Create(new ObjectInfo {Created = DateTime.Now,Modified = DateTime.Now,Path = path}, (object)value);if (_storage.Count > MaxObjects)_storage.Remove(_storage.OrderByDescending(kvp => kvp.Value.Item1.Created).First().Key);}return true;}

这显然不是 我们想要的,我们需要的是完整的日志;

public SubmissionResponse PostEvents(IEnumerable<Event> events, ExceptionlessConfiguration config, IJsonSerializer serializer) {if (!config.IsValid)return new SubmissionResponse(500, message: "Invalid client configuration settings");string data = serializer.Serialize(events);string url = String.Format("{0}/events", GetServiceEndPoint(config));HttpResponseMessage response;try {HttpContent content = new StringContent(data, Encoding.UTF8, "application/json");// don't compress data smaller than 4kbif (data.Length > 1024 * 4)content = new GzipContent(content);_client.Value.AddAuthorizationHeader(config.ApiKey);response = _client.Value.PostAsync(url, content).ConfigureAwait(false).GetAwaiter().GetResult();} catch (Exception ex) {return new SubmissionResponse(500, exception: ex);}int settingsVersion;if (Int32.TryParse(GetSettingsVersionHeader(response.Headers), out settingsVersion))SettingsManager.CheckVersion(settingsVersion, config);return new SubmissionResponse((int)response.StatusCode, GetResponseMessage(response));}

所以我们需要在PostEvents 这个方法做文章;

目前我们的做法是:

就是把日志直接写到消息队列,然后做一个消费日志的订阅队列的服务,从队列读取数据,在写到Elasticsearch;

f2914c35e9e88d38ee42ac48cd8c89b2.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/286813.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iVX 基础

1.1 iVX 线上集成环境进入 点击 连接 或通过浏览器输入网址 https://editor.ivx.cn/ 进入线上集成开发环境。 进入 在线集成开发环境 后&#xff0c;可点击右上角 登录/注册 进行帐号登录或者注册。登录账户 后在进行项目开发时会自动保存项目开发进度。 [外链图片转存失败…

Android之靠谱的把图片和视频插入手机系统相册

1 需求 把图片和视频插入手机系统相册,网上查了下基本上很乱,没几个靠谱的。 2 结果爆照 3 思路 图片插入系统相册(可以直接插入系统相册,但是我这里多做了一步就是先把图片拷贝到了一个目录再插入系统相册) 视频插入系统相册(先把视频拷贝到MIUI目录,然后再…

C# WPF 实现Tab页动态增减

概述Tab页面是一个很常用的控件&#xff0c;针对页面固定的场景&#xff0c;直接给Item进行数据绑定就行&#xff0c;如下所示&#xff1a;<dx:DXTabControl cal:Message.Attach"[Event Loaded][TabControl_Loaded($source,$eventArgs)]"><dx:DXTabItem Hea…

2014 网选 上海赛区 hdu 5047 Sawtooth

题意&#xff1a;求n个M型的折线将一个平面分成的最多的面数&#xff01; 思路&#xff1a;我们都知道n条直线将一个平面分成的最多平面数是 An An-1 n1 也就是f(n) (n*n n 2)/2 对于一个M型的折线呢&#xff1f;它有四条线&#xff0c;但是由于三个顶点的关系导致划分的平…

二、基础(IVX快速开发手册)

二、基础 通过本节你将了解 iVX 所支持应用的创建方法。 文章目录二、基础2.1 iVX 线上集成环境进入2.2 创建项目2.3 选择项目类型2.3.1 WebApp/小程序/原生应用2.3.2 微信小游戏2.3.3 微信小程序&#xff08;原生组件&#xff09;2.1 iVX 线上集成环境进入 点击 连接 或通过…

Android之TabLayout+ViewPager2+FragmentStateAdapter实现带数字变化的TAB选项

1 问题 TabLayout+ViewPager2实现带数字变化的TAB选项,然后左边滑动或者点击上面的Tab切换fragment不能刷新 2 结果爆照 3 代码实现 layer_tab_indicator.xml <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="h…

slq2000数据库升级到sql2012

看到标题&#xff0c;估计有同行笑了&#xff0c;这年代还有用sql2000的&#xff1f;真的有&#xff0c;最近单位服务器数据迁移升级&#xff0c;将数据库迁移到新服务器后&#xff0c;发现数据全是2000的&#xff0c;无法直接导入到sql2012。没办法&#xff0c;只能先将数据库…

电脑网页打不开但qq能上解决方法

2019独角兽企业重金招聘Python工程师标准>>> 问题描述&#xff1a; 电脑网页打不开但qq能上。 问题原因&#xff1a; 是由于电脑系统的DNS解析出了问题。 解决方法&#xff1a; 首先在键盘上同时按下 winR 然后在弹窗中输入cmd &#xff0c; 再按enter键&#xf…

基于Linux命令行KVM虚拟机的安装配置与基本使用

背景由于生产环境的服务器并不会安装桌面环境&#xff0c;简单操作的图形化安装也不适合批量部署安装。因此&#xff0c;我还是更倾向于在命令下安装配置KVM虚拟机。结合了一些资料和个人使用的状况&#xff0c;我大致列出了一些基本和常用的使用方法。 安装配置一、环境介绍操…

四、WebApp 基础可视组件(IVX 快速开发教程)

四、基础可视组件 通过本节你将了解 iVX 开发中的核心—— iVX 组件的使用方法。iVX 的组件是开发应用时所必要的对象&#xff0c;通过这些对象你将快速的完成应用的开发。 在 iVX 应用开发中&#xff0c;所有交互、动画、数据都需要以组件为基础&#xff0c;通过组件之间的编…

Springboot项目搭建(三)整合thymeleaf模板

springboot整合thymeleaf模板 一、POM文件添加依赖 <!--thymeleaf--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency><!--nekohtml 解决thymea…

React-引领未来的用户界面开发框架-读书笔记(一)

这本书的主要内容都是以react v0.12为主&#xff0c;ES5语法&#xff0c;笔记中将会使用react v0.14和RS6。 第1章 react简介 1.本质上是一个状态机&#xff0c;它以精简的模型管理复杂的随着时间而变化的状态。 2.它不是model-view-controller&#xff0c;它是mvc中的v(view)&…

Android之提示This version of Android Studio cannot open this project, please retry with Android Studio

1 问题 编译项目&#xff0c;错误提示如下 This version of Android Studio cannot open this project, please retry with Android Studio 2 解决办法 很明显&#xff0c;看英语翻译也知道&#xff0c;是由于AS版本太低导致&#xff0c;升级AS就可以了。

Netflix 的 API 架构演变历程

Netflix 以其松耦合和高度可扩展的微服务架构而闻名&#xff0c;Netflix API 的后端架构经历了 4 个主要阶段。&#x1d40c;&#x1d428;&#x1d427;&#x1d428;&#x1d425;&#x1d422;&#x1d42d;&#x1d421; &#x1d40c;&#x1d428;&#x1d427;&#x1d…

五、Web App 基础可视组件属性(IVX 快速开发教程)

五、基础可视组件属性 在 iVX 中各个组件存在不同的属性&#xff0c;这些属性用于设置显示的样式或者是自身具备的特征等&#xff0c;通过更改这些属性可以极大的方便我们进行项目的创作。 大多数组件都拥有相同的属性&#xff0c;相同属性在以下内容中不会赘述介绍&#xff…

zabbix自动发现(Discovery)功能使用

随着监控主机不断增多&#xff0c;有的时候需要添加一批机器&#xff0c;特别是刚用zabbix的童鞋 需要将公司的所有服务器添加到zabbix&#xff0c;如果使用传统办法去单个添加设备、分组、项目、图像…..结果应该是让人吐的结果。 鉴于这个问题我们可以好好利用下Zabbix大…

Apache之三种工作模式和配置性能优化

1 Apache的3种模式和版本 Apache目前一共有三种稳定的MPM&#xff08;Multi-Processing Module&#xff0c;多进程处理模块&#xff09;模式&#xff0c;它们分别是prefork&#xff0c;worker和event。 我们可以使用httpd -V 命令查看apache的版本和模式&#xff0c;如果你服务…

lsof命令

lsof, LiSt Opened Files, 列出打开的文件, 听起来很简单的样子. 但想*nix中很多其他工具一样, lsof把这件简单的事情做到了炉火纯青. 因为Unix认为”一切皆文件”, 那么”打开的文件”就不仅仅是传统意义上打开的文件了, 还可以是网络/Unix域套接字, 匿名/具名管道, 共享库文件…

六、WebApp 二手信息站点页面制作(IVX 快速开发教程)

六、二手信息站点页面制作 在了解了基础可视组件后&#xff0c;我们可以通过这些可视组件进行站点页面开发&#xff0c;在此以一个二手交易网站站点页面为例&#xff0c;本教程示例并不是成熟完善的示例&#xff0c;需要各位读者进行少量完善&#xff0c;示例只是用于功能讲解…

Blazor University (25)路由 —— 通过 HTML 导航

原文链接&#xff1a;https://blazor-university.com/routing/navigating-our-app-via-html/通过 HTML 导航源代码[1]链接到 Blazor 组件中的路由的最简单方法是使用 HTML 超链接。<a href"/Counter">This works just fine</a>Blazor 组件中的超链接会被…