CodeSnippet.info整体架构

服务器端

Asp.NET MVC5

考察过MVC6,但是现在MVC6还不成熟,技术上不稳定,很多资料也比较少。
所以网站暂时使用MVC5.当然网站的大部分业务逻辑是和MVC框架脱离的,以后升级也应该不会出现很大问题。

数据库选择

数据库暂时使用MongoDB,使用MongoDB纯粹是站长的个人兴趣爱好。
(MongoDB 3.2.4 WireTiger数据库引擎)
MongoDB的优点和缺点十分明显

优点

1.使用MongoDB的C#官方驱动程序,天然的ORM。
2.文档化的数据结构,简化了设计
3.使用MongoDB的TTL索引,可以实现定时缓存功能,数据经过指定时间后就自动从数据库里面删除。
TTL Indexes 官方说明

下面对于CreateDateTime字段设置了一个TTL索引,900秒后自动过期

4.自带GridFileSystem,可以在数据库里面存放文件
GridFS官方说明

缺点

当然,最大的缺点就是对于内存消耗实在太大了。MongoDB就是一个消耗内存的怪兽,如果没有取之不竭的内存,千万不要将文件放在数据库中。
插入17万条数据:每条数据平均大小 0.8K
数据大小144M,压缩存放后占用磁盘空间42兆
整体的索引大小2.34M。

占用内存是多少呢?初始状态:214M,然后随着时间的推移,一直会飙升到600M,很有可能造成服务器内存不足,Mongod线程意外终止。

文件保存

方案1 七牛存储

七牛存储作为一个提供存储的空间,文件的上传下载在编码层面非常方便。
从成本上看,存储 10G 以下是免费的,当然10G以上的收费也还可以,但是成本的大部分还是在流量上面。

方案2 MongoDB

MongoDB自带的GridFileSystem,使用非常方便,数据都保存在本地,安全性是最好的。但是对于内存的消耗实在太大了。

方案3 操作系统的FileSystem

本网站暂时使用这种方案,在网站规模不大的时候,性价比是最高的。

全文检索

ElasticSearch

整个网站虽然使用的是ASP.NET,但是并不妨碍使用Java阵营的产品。
现在网站使用的是ElasticSearch引擎,通过NEST这个Net的客户端类库操作ElasticSearch。
(暂时仅仅对标题进行了索引,没有对于文档内容进行索引)
使用NEST操作ElasticSearch进行全文检索

第三方验证

Github OAuth

由于IT技术人员大都有Github账号,同时为了防止本网站被攻击造成账号泄露,本网站现在使用Github的第三方验证。
使用Github网站OAuth系API进行第三方验证

PDF输出

Spire.Pdf

.NET PDF Component
使用的是免费版本,每个PDF最大页数为10页,如果需要可以考虑购买许可证,599美元。
生成的PDF效果一般,支持HTML中外部图片的抓取,支持简单的CSS和Javascript.
(注意:Microsoft.mshtml.dll 这个动态链接库必须放到网站的Bin目录中。这个插件的本质就是通过内置的浏览器抓取截图
如果有复杂的Javascript生成界面的话,可能抓取的瞬间很多界面都没有完成)

MarkDown编辑器

Editor.md

Editor.md

(该项目很久没有更新了,或多或少存在一些BUG)
备用MarkDown编辑器:https://github.com/yutuo/mdeditor.yt

CodeSnippet.info整体技术构架的更多相关文章

  1. 本人提供微软系.NET技术顾问服务,欢迎企业咨询!

    背景: 1:目前微软系.NET技术高端人才缺少. 2:企业很难直接招到高端技术人才. 3:本人提供.NET技术顾问,保障你的产品或项目在正确的技术方向. 技术顾问服务 硬服务项: 1:提供技术.决策. ...

  2. Suggestion(搜索建议)产品和技术

    今天来简单聊聊Suggestion产品 什么是Suggestion服务? 一图胜千言: 当你想要搜索某个长词语或者一句话输入部分时,Suggestion服务预测你极大可能的候选项,并罗列出来,供你选择 ...

  3. Spring技术内幕——深入解析Spring架构与设计原理(一)IOC实现原理

    IOC的基础 下面我们从IOC/AOP开始,它们是Spring平台实现的核心部分:虽然,我们一开始大多只是在这个层面上,做一些配置和外部特性的使用工作,但对这两个核心模块工作原理和运作机制的理解,对深 ...

  4. 极光推送CTO黄鑫:技术人员要建立自己的知识图谱

    本周,我们邀请到了极光推送CTO兼首席科学家黄鑫进行人物专访,在展示风采的同时,也分享会员们对技术.对工作.对人生的感悟.       扎实的底层服务是扩张关键 极光推送是一个做第三方云服务的公司,在 ...

  5. 关于IT公司技术委员会职责

    技术委员会的核心职责 组织人才相关 • 制定职级标准 - 能力框架:知识,技能,通用素质 - 职级标准:T2T3T4-P7P8P9- • 职级评审,对齐标准 • 高端招聘,对齐标准 • 校园招聘,对齐 ...

  6. AngelToken:区块链技术的突破

    科技进步,直接捅破了政治.金融.军事领域所有的玩法,让工业革命以来形成的规则变得一钱不值. 而且,当下的最重要的技术趋势——区块链.Token.AngelToken,正在引导我们走向全面的失控和未知. ...

  7. hadoop大数据基础框架技术详解

    一.什么是大数据 进入本世纪以来,尤其是2010年之后,随着互联网特别是移动互联网的发展,数据的增长呈爆炸趋势,已经很难估计全世界的电子设备中存储的数据到底有多少,描述数据系统的数据量的计量单位从MB ...

  8. 一个CTO谈自己的技术架构体系

    理解算法背后的世界观 我比较擅长的领域可能是数据和架构两个方面吧. 大数据方面就是数据挖掘.数据分析等领域,我现在带着极光推送整个的数据团队,需要把握数据团队的技术方向,还需要做很多算法方面的研究. ...

  9. 3D动态人脸识别技术分析——世纪晟人脸识别实现三维人脸建模

    - 目录 - 国内3D动态人脸识别现状概况 - 新形势下人脸识别技术发展潜力 - 基于深度学习的3D动态人脸识别技术分析 1. 非线性数据建模方法 2. 基于3D变形模型的人脸建模 - 案例结合——世 ...

随机推荐

  1. 在cocos2dx和unity3d之间选择

    人生最纠结的事,莫过于有选择………… cocos2dx和unity3d从某种意义上讲,都很不错.但当面对特定需求以及团队情况的时候,总是能分出高下的. 假设,目标游戏是一款类似 刀塔传奇 的游戏 我们 ...

  2. JSONP浅析

    DEMO : JSONP示例 为什么使用JSONP JSONP和JSON是不一样的.JSON(JavaScript Object Notation)是一种基于文本的数据交换方式,或者叫做数据描述格式. ...

  3. Servlet Filter

    Filter : Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应. 主要用于对HttpServletRequest 进行预处理,也可以对Http ...

  4. Android 图片文件操作、屏幕相关、.9图片的理解

     一:Android图片操作 1.存储bitmap到本地文件系统 public static void bitmapToFile(Bitmap bitmap, String uri) { if(!ex ...

  5. 学习ASP.NET MVC(五)——我的第一个ASP.NET MVC CURD页面

    在上一篇文章中我们已经创建了实体类,在这一篇文章中,我将创建一个新的控制器类——BookController,使用BookController对Books表中的数据进行CURD操作的方法,并使用视图模 ...

  6. 移动端IM开发需要面对的技术问题

    1.前言 这两年多一直从事网易云信 iOS 端 IM SDK的开发,期间不断有兄弟部门的同事和合作伙伴过来问各种技术细节,干脆统一介绍下一个IM APP的方方面面,包括技术选型(包括通讯方式,网络连接 ...

  7. KnockoutJS 3.X API 第四章 数据绑定(5) 控制流component绑定

    本节目录: 一个例子 API 备注1:仅模板式的component 备注2:component虚拟绑定 备注3:传递标记到component绑定 内存管理 一个例子 First instance, w ...

  8. 【WP8.1开发】认识后台任务

    在手机上,使用后台,不像电脑上那么随意,准确地讲嘛,在移动平台上,后台任务都有严格的限制.至于说为什么会有这么多限制,我估计初衷很明显——保证系统的性能不受某个或某几个应用的负面影响:另外就是出于安全 ...

  9. javascript类型系统——undefined和null

    × 目录 [1]原因 [2]undefined [3]null 前面的话 一般的程序语言,表示空的只有null,但javascript的设计者Brendan Eich却设计了一个undefined,这 ...

  10. js获取url地址中的参数

    <script type="text/javascript"> function GetQueryString(name) { var reg = new RegExp ...