1.我用kafka两年踩过的一些非比寻常的坑

2.戴尔电脑网络有点问拿去店里花了199重装了系统有没有被坑?

3.选一款好点的杀毒软件,刚买的联想笔记本电脑,大家指点一下

4.手把手教你定制一套适合团队的微前端体系

我用kafka两年踩过的一些非比寻常的坑

电脑系统有点坑怎么办啊-电脑系统有点坑怎么办啊怎么解决

前言

我的博客

我的上家公司是做餐饮系统的,每天中午和晚上用餐高峰期,系统的并发量不容小觑。为了保险起见,公司规定各部门都要在吃饭的时间轮流值班,防止出现线上问题时能够及时处理。

我当时在后厨显示系统团队,该系统属于订单的下游业务。用户点完菜下单后,订单系统会通过发kafka消息给我们系统,系统读取消息后,做业务逻辑处理,持久化订单和菜品数据,然后展示到划菜客户端。这样厨师就知道哪个订单要做哪些菜,有些菜做好了,就可以通过该系统出菜。系统自动通知服务员上菜,如果服务员上完菜,修改菜品上菜状态,用户就知道哪些菜已经上了,哪些还没有上。这个系统可以大大提高后厨到用户的效率。

事实证明,这一切的关键是消息中间件:kafka,如果它有问题,将会直接影响到后厨显示系统的功能。

接下来,我跟大家一起聊聊使用kafka两年时间踩过哪些坑?

顺序问题1. 为什么要保证消息的顺序?

刚开始我们系统的商户很少,为了快速实现功能,我们没想太多。既然是走消息中间件kafka通信,订单系统发消息时将订单详细数据放在消息体,我们后厨显示系统只要订阅topic,就能获取相关消息数据,然后处理自己的业务即可。

不过这套方案有个关键因素:要保证消息的顺序。

为什么呢?

订单有很多状态,比如:下单、支付、完成、撤销等,不可能下单的消息都没读取到,就先读取支付或撤销的消息吧,如果真的这样,数据不是会产生错乱?

好吧,看来保证消息顺序是有必要的。

2.如何保证消息顺序?

我们都知道kafka的topic是无序的,但是一个topic包含多个partition,每个partition内部是有序的。

![]()

如此一来,思路就变得清晰了:只要保证生产者写消息时,按照一定的规则写到同一个partition,不同的消费者读不同的partition的消息,就能保证生产和消费者消息的顺序。

我们刚开始就是这么做的,同一个商户编号的消息写到同一个partition,topic中创建了4个partition,然后部署了4个消费者节点,构成消费者组,一个partition对应一个消费者节点。从理论上说,这套方案是能够保证消息顺序的。

一切规划得看似“天衣无缝”,我们就这样”顺利“上线了。

3.出现意外

该功能上线了一段时间,刚开始还是比较正常的。

但是,好景不长,很快就收到用户投诉,说在划菜客户端有些订单和菜品一直看不到,无法划菜。

我定位到了原因,公司在那段时间网络经常不稳定,业务接口时不时报超时,业务请求时不时会连不上数据库。

这种情况对顺序消息的打击,可以说是毁灭性的。

为什么这么说?

假设订单系统发了:”下单“、”支付“、”完成“ 三条消息。而”下单“消息由于网络原因我们系统处理失败了,而后面的两条消息的数据是无法入库的,因为只有”下单“消息的数据才是完整的数据,其他类型的消息只会更新状态。

加上,我们当时没有做失败重试机制,使得这个问题被放大了。问题变成:一旦”下单“消息的数据入库失败,用户就永远看不到这个订单和菜品了。

那么这个紧急的问题要如何解决呢?

4.解决过程

最开始我们的想法是:在消费者处理消息时,如果处理失败了,立马重试3-5次。但如果有些请求要第6次才能成功怎么办?不可能一直重试呀,这种同步重试机制,会阻塞其他商户订单消息的读取。

显然用上面的这种同步重试机制在出现异常的情况,会严重影响消息消费者的消费速度,降低它的吞吐量。

如此看来,我们不得不用异步重试机制了。

如果用异步重试机制,处理失败的消息就得保存到重试表下来。

但有个新问题立马出现:只存一条消息如何保证顺序?

存一条消息的确无法保证顺序,假如:”下单“消息失败了,还没来得及异步重试。此时,”支付“消息被消费了,它肯定是不能被正常消费的。

此时,”支付“消息该一直等着,每隔一段时间判断一次,它前面的消息都有没有被消费?

如果真的这么做,会出现两个问题:

”支付“消息前面只有”下单“消息,这种情况比较简单。但如果某种类型的消息,前面有N多种消息,需要判断多少次呀,这种判断跟订单系统的耦合性太强了,相当于要把他们系统的逻辑搬一部分到我们系统。

影响消费者的消费速度

这时有种更简单的方案浮出水面:消费者在处理消息时,先判断该订单号在重试表有没有数据,如果有则直接把当前消息保存到重试表。如果没有,则进行业务处理,如果出现异常,把该消息保存到重试表。

后来我们用elastic-job建立了失败重试机制,如果重试了7次后还是失败,则将该消息的状态标记为失败,发邮件通知开发人员。

终于由于网络不稳定,导致用户在划菜客户端有些订单和菜品一直看不到的问题被解决了。现在商户顶多偶尔延迟看到菜品,比一直看不菜品好太多。

消息积压

随着销售团队的市场推广,我们系统的商户越来越多。随之而来的是消息的数量越来越大,导致消费者处理不过来,经常出现消息积压的情况。对商户的影响非常直观,划菜客户端上的订单和菜品可能半个小时后才能看到。一两分钟还能忍,半个消息的延迟,对有些暴脾气的商户哪里忍得了,马上投诉过来了。我们那段时间经常接到商户投诉说订单和菜品有延迟。

虽说,加服务器节点就能解决问题,但是按照公司为了省钱的惯例,要先做系统优化,所以我们开始了消息积压问题解决之旅。

1. 消息体过大

虽说kafka号称支持百万级的TPS,但从producer发送消息到broker需要一次网络IO,broker写数据到磁盘需要一次磁盘IO(写操作),consumer从broker获取消息先经过一次磁盘IO(读操作),再经过一次网络IO。![]()

一次简单的消息从生产到消费过程,需要经过2次网络IO和2次磁盘IO。如果消息体过大,势必会增加IO的耗时,进而影响kafka生产和消费的速度。消费者速度太慢的结果,就会出现消息积压情况。

除了上面的问题之外,消息体过大,还会浪费服务器的磁盘空间,稍不注意,可能会出现磁盘空间不足的情况。

此时,我们已经到了需要优化消息体过大问题的时候。

如何优化呢?

我们重新梳理了一下业务,没有必要知道订单的中间状态,只需知道一个最终状态就可以了。

如此甚好,我们就可以这样设计了:

订单系统发送的消息体只用包含:id和状态等关键信息。

后厨显示系统消费消息后,通过id调用订单系统的订单详情查询接口获取数据。

后厨显示系统判断数据库中是否有该订单的数据,如果没有则入库,有则更新。

![]()

果然这样调整之后,消息积压问题很长一段时间都没再出现。

2. 路由规则不合理

还真别高兴的太早,有天中午又有商户投诉说订单和菜品有延迟。我们一查kafka的topic竟然又出现了消息积压。

但这次有点诡异,不是所有partition上的消息都有积压,而是只有一个。

刚开始,我以为是消费那个partition消息的节点出了什么问题导致的。但是经过排查,没有发现任何异常。

这就奇怪了,到底哪里有问题呢?

后来,我查日志和数据库发现,有几个商户的订单量特别大,刚好这几个商户被分到同一个partition,使得该partition的消息量比其他partition要多很多。

这时我们才意识到,发消息时按商户编号路由partition的规则不合理,可能会导致有些partition消息太多,消费者处理不过来,而有些partition却因为消息太少,消费者出现空闲的情况。

为了避免出现这种分配不均匀的情况,我们需要对发消息的路由规则做一下调整。

我们思考了一下,用订单号做路由相对更均匀,不会出现单个订单发消息次数特别多的情况。除非是遇到某个人一直加菜的情况,但是加菜是需要花钱的,所以其实同一个订单的消息数量并不多。

调整后按订单号路由到不同的partition,同一个订单号的消息,每次到发到同一个partition。

调整后,消息积压的问题又有很长一段时间都没有再出现。我们的商户数量在这段时间,增长的非常快,越来越多了。

3. 批量操作引起的连锁反应

在高并发的场景中,消息积压问题,可以说如影随形,真的没办法从根本上解决。表面上看,已经解决了,但后面不知道什么时候,就会冒出一次,比如这次:

有天下午,产品过来说:有几个商户投诉过来了,他们说菜品有延迟,快查一下原因。

这次问题出现得有点奇怪。

为什么这么说?

首先这个时间点就有点奇怪,平常出问题,不都是中午或者晚上用餐高峰期吗?怎么这次问题出现在下午?

根据以往积累的经验,我直接看了kafka的topic的数据,果然上面消息有积压,但这次每个partition都积压了十几万的消息没有消费,比以往加压的消息数量增加了几百倍。这次消息积压得极不寻常。

我赶紧查服务监控看看消费者挂了没,还好没挂。又查服务日志没有发现异常。这时我有点迷茫,碰运气问了问订单组下午发生了什么事情没?他们说下午有个促销活动,跑了一个JOB批量更新过有些商户的订单信息。

这时,我一下子如梦初醒,是他们在JOB中批量发消息导致的问题。怎么没有通知我们呢?实在太坑了。

虽说知道问题的原因了,倒是眼前积压的这十几万的消息该如何处理呢?

此时,如果直接调大partition数量是不行的,历史消息已经存储到4个固定的partition,只有新增的消息才会到新的partition。我们重点需要处理的是已有的partition。

直接加服务节点也不行,因为kafka允许同组的多个partition被一个consumer消费,但不允许一个partition被同组的多个consumer消费,可能会造成资源浪费。

看来只有用多线程处理了。

为了紧急解决问题,我改成了用线程池处理消息,核心线程和最大线程数都配置成了50。

调整之后,果然,消息积压数量不断减少。

但此时有个更严重的问题出现:我收到了报警邮件,有两个订单系统的节点down机了。

不久,订单组的同事过来找我说,我们系统调用他们订单查询接口的并发量突增,超过了预计的好几倍,导致有2个服务节点挂了。他们把查询功能单独整成了一个服务,部署了6个节点,挂了2个节点,再不处理,另外4个节点也会挂。订单服务可以说是公司最核心的服务,它挂了公司损失会很大,情况万分紧急。

为了解决这个问题,只能先把线程数调小。

幸好,线程数是可以通过zookeeper动态调整的,我把核心线程数调成了8个,核心线程数改成了10个。

后面,运维把订单服务挂的2个节点重启后恢复正常了,以防万一,再多加了2个节点。为了确保订单服务不会出现问题,就保持目前的消费速度,后厨显示系统的消息积压问题,1小时候后也恢复正常了。

后来,我们开了一次复盘会,得出的结论是:

订单系统的批量操作一定提前通知下游系统团队。

下游系统团队多线程调用订单查询接口一定要做压测。

这次给订单查询服务敲响了警钟,它作为公司的核心服务,应对高并发场景做的不够好,需要做优化。

对消息积压情况加监控。

顺便说一下,对于要求严格保证消息顺序的场景,可以将线程池改成多个队列,每个队列用单线程处理。

4. 表过大

为了防止后面再次出现消息积压问题,消费者后面就一直用多线程处理消息。

但有天中午我们还是收到很多报警邮件,提醒我们kafka的topic消息有积压。我们正在查原因,此时产品跑过来说:又有商户投诉说菜品有延迟,赶紧看看。这次她看起来有些不耐烦,确实优化了很多次,还是出现了同样的问题。

在外行看来:为什么同一个问题一直解决不了?

其实技术心里的苦他们是不知道的。

表面上问题的症状是一样的,都是出现了菜品延迟,他们知道的是因为消息积压导致的。但是他们不知道深层次的原因,导致消息积压的原因其实有很多种。这也许是使用消息中间件的通病吧。

我沉默不语,只能硬着头皮定位原因了。

后来我查日志发现消费者消费一条消息的耗时长达2秒。以前是500毫秒,现在怎么会变成2秒呢?

奇怪了,消费者的代码也没有做大的调整,为什么会出现这种情况呢?

查了一下线上菜品表,单表数据量竟然到了几千万,其他的划菜表也是一样,现在单表保存的数据太多了。

我们组梳理了一下业务,其实菜品在客户端只展示最近3天的即可。

这就好办了,我们服务端存着多余的数据,不如把表中多余的数据归档。于是,DBA帮我们把数据做了归档,只保留最近7天的数据。

如此调整后,消息积压问题被解决了,又恢复了往日的平静。

主键冲突

别高兴得太早了,还有其他的问题,比如:报警邮件经常报出数据库异常:Duplicate entry '6' for key 'PRIMARY',说主键冲突。

出现这种问题一般是由于有两个以上相同主键的sql,同时插入数据,第一个插入成功后,第二个插入的时候会报主键冲突。表的主键是唯一的,不允许重复。

我仔细检查了代码,发现代码逻辑会先根据主键从表中查询订单是否存在,如果存在则更新状态,不存在才插入数据,没得问题。

这种判断在并发量不大时,是有用的。但是如果在高并发的场景下,两个请求同一时刻都查到订单不存在,一个请求先插入数据,另一个请求再插入数据时就会出现主键冲突的异常。

解决这个问题最常规的做法是:加锁。

我刚开始也是这样想的,加数据库悲观锁肯定是不行的,太影响性能。加数据库乐观锁,基于版本号判断,一般用于更新操作,像这种插入操作基本上不会用。

剩下的只能用分布式锁了,我们系统在用redis,可以加基于redis的分布式锁,锁定订单号。

但后面仔细思考了一下:

加分布式锁也可能会影响消费者的消息处理速度。

消费者依赖于redis,如果redis出现网络超时,我们的服务就悲剧了。

所以,我也不打算用分布式锁。

而是选择使用mysql的INSERT INTO ...ON DUPLICATE KEY UPDATE语法:

?INSERTINTOtable?(column_list)?VALUES?(value_list)?ONDUPLICATEKEYUPDATE?c1?=?v1,c2?=?v2,?...;

它会先尝试把数据插入表,如果主键冲突的话那么更新字段。

把以前的insert语句改造之后,就没再出现过主键冲突问题。

数据库主从延迟

不久之后的某天,又收到商户投诉说下单后,在划菜客户端上看得到订单,但是看到的菜品不全,有时甚至订单和菜品数据都看不到。

这个问题跟以往的都不一样,根据以往的经验先看kafka的topic中消息有没有积压,但这次并没有积压。

再查了服务日志,发现订单系统接口返回的数据有些为空,有些只返回了订单数据,没返回菜品数据。

这就非常奇怪了,我直接过去找订单组的同事。他们仔细排查服务,没有发现问题。这时我们不约而同的想到,会不会是数据库出问题了,一起去找DBA。果然,DBA发现数据库的主库同步数据到从库,由于网络原因偶尔有延迟,有时延迟有3秒。

如果我们的业务流程从发消息到消费消息耗时小于3秒,调用订单详情查询接口时,可能会查不到数据,或者查到的不是最新的数据。

这个问题非常严重,会导致直接我们的数据错误。

为了解决这个问题,我们也加了重试机制。调用接口查询数据时,如果返回数据为空,或者只返回了订单没有菜品,则加入重试表。

调整后,商户投诉的问题被解决了。

重复消费

kafka消费消息时支持三种模式:

at most once模式 最多一次。保证每一条消息commit成功之后,再进行消费处理。消息可能会丢失,但不会重复。

at least once模式 至少一次。保证每一条消息处理成功之后,再进行commit。消息不会丢失,但可能会重复。

exactly once模式 精确传递一次。将offset作为唯一id与消息同时处理,并且保证处理的原子性。消息只会处理一次,不丢失也不会重复。但这种方式很难做到。

kafka默认的模式是at least once,但这种模式可能会产生重复消费的问题,所以我们的业务逻辑必须做幂等设计。

而我们的业务场景保存数据时使用了INSERT INTO ...ON DUPLICATE KEY UPDATE语法,不存在时插入,存在时更新,是天然支持幂等性的。

多环境消费问题

我们当时线上环境分为:pre(预发布环境) 和 prod(生产环境),两个环境共用同一个数据库,并且共用同一个kafka集群。

需要注意的是,在配置kafka的topic的时候,要加前缀用于区分不同环境。pre环境的以pre开头,比如:pre_order,生产环境以prod开头,比如:prod_order,防止消息在不同环境中串了。

但有次运维在pre环境切换节点,配置topic的时候,配错了,配成了prod的topic。刚好那天,我们有新功能上pre环境。结果悲剧了,prod的有些消息被pre环境的consumer消费了,而由于消息体做了调整,导致pre环境的consumer处理消息一直失败。

其结果是生产环境丢了部分消息。不过还好,最后生产环境消费者通过重置offset,重新读取了那一部分消息解决了问题,没有造成太大损失。

后记

除了上述问题之外,我还遇到过:

kafka的consumer使用自动确认机制,导致cpu使用率100%。

kafka集群中的一个broker节点挂了,重启后又一直挂。

这两个问题说起来有些复杂,我就不一一列举了,有兴趣的朋友可以关注我的公众号,加我的微信找我私聊。

非常感谢那两年使用消息中间件kafka的经历,虽说遇到过挺多问题,踩了很多坑,走了很多弯路,但是实打实的让我积累了很多宝贵的经验,快速成长了。

其实kafka是一个非常优秀的消息中间件,我所遇到的绝大多数问题,都并非kafka自身的问题(除了cpu使用率100%是它的一个bug导致的之外)。

文章来自:苏三说技术

原文: style="font-size: 18px;font-weight: bold;border-left: 4px solid #a10d00;margin: 10px 0px 15px 0px;padding: 10px 0 10px 20px;background: #f1dada;">戴尔电脑网络有点问拿去店里花了199重装了系统有没有被坑?

呵呵,老妹儿你已经被惨无人道的坑了,店里这哥们心太黑了,我估计你长得不漂亮,哈哈哈哈哈 要不怎么的也不能收你这么多钱。我以前就是做dell的,首先你买戴尔那你就应该了解,戴尔的硬件维修是免费的是上门的,其实你要是有什么问题打给客服就行,就硬说机器坏了就像你遇到的出乱码了,你可以说花屏了吗。客服要是让你检测你就检测反正就是不好用,呵呵他们是会派人来的,到时候都会给你弄的。咱们在说这个买戴尔的店,真心不行跟我那阵没法比,我们都承诺客户软件终身保的,因为重做系统在我们看来实在太简单了,回G一下就完事。你这是哑巴亏,你去找他理论也没有什么用因为这个东西没有具体物价参考,你要是实在要闹就物价局工商局走一圈。我建议你以后自己做个u盘启动,网上一百度就有,拿个u盘就能做。很简单的以后自己做系统就完了。完全傻瓜操作。既不用在花钱还能在那些一样小白朋友面前显摆一下。

选一款好点的杀毒软件,刚买的联想笔记本电脑,大家指点一下

世界上公认的比较著名的杀毒软件有卡巴斯基,F-SECURE,MACFEE,诺顿,趋势科技,熊猫,NOD32,AVG,F-PORT等等。其中卡巴,macfee,诺顿又被誉为世界三大杀毒软件!每个杀毒软件都有自身的优势,当然也有不足之处!

比如卡巴斯基的杀毒能力确实很强,对的起排名世界第一的称号,但是监控方面却存在不足,而且在内存占用方面始终令人头疼。Macfee的系统监控恰恰是做的最好的。NOD32的扫毒速度最快,内存占用方面最少,全球获奖无数,因而成为微软御用4年的杀毒软件也绝非空穴来风。熊猫可能大家以为是中国的,其实也是洋货啦,杀毒理念和模块最先进,可惜老是提示你要重新激活,所以破解的不大完美!诺顿大家很熟悉,老实说诺顿的广告宣传还真是不错的,但是大家注意,别看广告,看疗效!当诺顿屡次告诉你XX病毒被隔离,无法清除时,你是否感到厌倦了呢?当然诺顿企业版要比个人版本的杀毒能力更强悍,建议大家使用9.0的,最新10.0占用资源有点大,不算完美。F-SECURE可能知道的人很少,别说用的人了,呵呵。我自己现在用的杀软就是这款,其实这款杀毒软件名气是相当响的。来自芬兰的杀毒软件,集合AVP,LIBRA,ORION,DRACO四套杀毒引擎,其中一个就是Kaspersky的杀毒内核,而且青出于蓝胜于蓝,个人感觉杀毒效率比Kaspersky要好,对网络流行病毒尤其有效。在《PCUtilites》评测中超过Kaspersky名列第一。该软件采用分布式防火墙技术。f-secure曾经超过Kaspersky,排名第一,但后来Kaspersky增加了扩展病毒库,反超f-secure。鉴于普通用户用不到扩展病毒库,因此f-secure还是普通用户很不错的一个选择。所以我用下来的感觉就是F-SECURE的综合能力可以排第一名!但是这个软件也有不足,就是进程太多,要近15个进程,呵呵,谁叫它有四套杀毒引

擎呢?不过也够安全吧。进程虽多,却一点不觉得卡!

在此不得不提起国产杀毒软件,国产杀毒软件也有很多用户群,个性化的界面也赢得了很多用户的青睐。比如瑞星的那个小狮子就蛮可爱的,做个桌面宠物也不错。但是有很多人会说,国产的技术不行,靠不住的。呵呵,其实我倒不这么认为!国产杀毒软件我最喜欢的就是KV2005,江民的东西还是老牌子,杀毒监控实力不俗。瑞星和金山的起步晚一些,有些地方做的还是不够理想,但毕竟是在不断进步,希望能越做越好,给中国人也争光一把,哈哈。也许有人会说实际的杀毒能力说明一切,金山,瑞星和卡巴比就是垃圾等等。呵呵,那你就错了,如果说卡巴能杀掉这个病毒,金山杀不掉,就说明卡巴强于金山?反过来金山能杀掉这个病毒,卡巴无法槌鲈趺此悖拷鹕角坑诳ò停亢芗虻ザ钜桓隼?樱?蠹铱梢匀ネ?舷略匾桓?005年病毒测试包样本,是个压缩包文件,里面大概有26个病毒样本,试试你的杀软吧,呵呵,江民,金山,瑞星兵不血刃的杀光了所有病毒,再看看卡巴啊,这次傻了吧,所以说每个杀毒软件都有自己的长处,不能一拍子否定。

还有的朋友问我一个杀毒软件保险伐,要不要装两个来个双保险,呵呵,对于这个我觉得是可行的,但是前提是你对杀毒软件的各项设置要比较了解而且自己的电脑配置要高档点,否则不是系统容易崩溃就是电脑被两个杀毒软件

拖垮的。比较典型的例子就是卡巴斯基+KV2005的组合,很显然卡巴系统监控的不足由KV2005来弥补。卡巴只负责杀毒即可了。但是这个豪华组合要牺牲很多内存,你电脑够劲的话可以试试。另外卡巴加NOD32也是不错的搭配,NO

D32查毒和监控方面都不错,而且查毒速度奇快,内存占用很小,这样你可以用NOD32行查毒,大家都知道卡巴的查毒速度是很慢的,因为病毒库多啊,每个文件都要那13W病毒库去套,能不慢嘛!

有的朋友关心哪个杀毒软件病毒库多哪个就牛,呵呵,大家都以为卡巴病毒库很多是伐,现在大概13万4千左右吧,但是面对罗马尼亚的杀软BitDefender

Professional近20W的病毒库,卡巴一边凉快去吧。所以BitDefender

Professional在2005年一些网站的测试中取得过第一名的成绩。但是病毒库多并不能说明问题,实际杀毒能力BitDefender

Professional并没有比卡巴更好,所以这个也是大家理解的误区!有人认为卡巴病毒库升级极其迅速所以最牛,虽然卡巴每小时都有升级,很频繁,但是很多病毒库都非最终版,也就是很容易出现误判的现象,所以建议大家到周末的时候再升级自己的卡巴,因为周末是卡巴整理一周病毒库,删除错误病毒库的时候

还有有的朋友认为杀毒软件只要杀毒厉害就是一流的,其实这种观点我认为也不对,比如macfee,它其实杀毒并没有怎么厉害,肯定没有卡巴那么野蛮,但是为什么它也拥有广泛的用户群,有很好的口碑,很显然macfee的监控做的很完美,可以说滴水不漏,监控这么好的杀软我想杀毒能力稍微弱点又有何妨呢?

因为第一道防线病毒都无法逾越的话不就是最大的成功么?反观卡巴杀毒是厉害,但是恰恰是由于它监控的不足,使病毒可以入侵,但鉴于杀毒能力很牛,所以第二道防线病毒就通不过了,这样逆向思考或许就能想通了!

另外一个大家关心的问题就是装了杀毒软件是否还要加装防火墙的问题,哪款防火墙最好等等!呵呵,其实个人感觉XPSP2自带的防火墙也已经蛮不错了,够用了。如果大家真的有要求的话,我个人认为可以这么做:

(1)如果你选择安装的是F-SECURE clientsecurity的话,那么这款杀毒软件自带防火墙程序,而且这个防火墙排名欧洲第一,绝对可以了已经。这样你就可

以不必再另外安装了,这个选择比较便捷!

(2)ZA,也就是ZONEALARM,用户群也蛮多额,ZA功能确实比较强大,但是对普通用户而言还是比较难上手,而且过于严格的规则可能导致上某些论坛出错,而且最新的ZA版本与卡巴斯基有严重冲突,所以卡巴的用户如果要安装ZA

防火墙的话还是悠着点,哈哈。实在想尝试的话可以考虑安装5.5版本的,这个稳定。'

(3)OP,也就是outpost,口碑很好,用户对其评价很高,号称世界排名第二的东东,对于广告拦截很有效果,反黑能力也很强悍,网上找个破解补丁可以使用10年,但是可能占用系统资源多一点,配置不高的用户可能上网会感觉

有点延迟。而且这款防火墙比较专业,上网过滤的东西也很多,很多网站的也被过滤掉,用户可能看的不习惯,所以大家自己看着办吧。

(4)Tiny personal firewall pro,tiny防火墙是我用过的防火墙里面感觉技术最为先进的一款,貌似是国外军方防火墙,呵呵。Tiny的规则相当严格和复杂,对于一些刚上手的朋友而言肯定吃不消的,而且tiny防火墙与卡巴的网页扫描功能有冲突,所以这款防火墙是超级强悍,东西绝对是一流的,不怕麻烦的朋友可以尝试安装。

(5)Lns,也就是传说中的look'n'stop,号称世界第一的顶级防火墙,只有600多KB,容量很小,系统资源占的很少,但是功能极其强大,只可惜设置超级复杂,很难上手,一般用户还是选择放弃吧,呵呵,虽然有一些别人编订的

规则包,但还是不大适合我们使用。

(6),天网,相信用的人满天飞,世界排名未知,呵呵,其实是根本埃不到边。天网可以算是一款入门级别的防火墙,和上述5款防火墙最大区别是非常容易上手,根本不需要设置什么东西,拿来就用!普通用户如果怕不装防火墙感觉

不安,但又怕设置麻烦的话,干脆就用用天网算了。

国产的瑞星或者天网都会标榜自己的防火墙规则是多么多么丰富,貌似搞的很牛的样 子,其实恰恰相反,规则越多防火墙性能越差,比如瑞星几乎天天更新规则,天网更是广告做到声称自己有1000条规则库文件,每次上网,天网防火墙不断闪动红色感叹号,报告XX用户试图连接本机XX端口,该包已被拦截,这个是不是增加你的心里安慰呢?每时每刻都在拦截信息,哪有这么多黑客会盯着你,天网这样做好像有点夸大其词了。其实有这么多规则顶用么?规则一多上网速度就越慢,每个探测端口的信息防火墙就要用近千条规则去衡量,这不傻掉啊!真正一流的防火墙并不需要超级多的规则,也不需要频繁更新,就如卡巴防火墙,虽然界面极其简单,更新也不快,但是一个隐藏模式就足以令国产的瑞星和天网闭嘴!

很多人热衷于做网上安全测试,我也做过几次,后来发现也不能说明什么问题,加装一流防火墙和不装防火墙就一定有本质区别?就拿诺顿安全测试来看,只用XPSP2自带防火墙就可以轻松通过所有测试,全部显示安全。呵呵,装个ZA也是安全,那到底装不装呢?所以大家也不要迷信这些测试网站。自己认为怎么顺手就怎么用好了!

乱七八糟说了这么多,也不知道大家有没有耐心看完额。以上涉及的杀毒软件或者防火墙本人每个都使用过,所以写的内容也是真实的使用体会。大家随便看看吧。如果各位图个方便,不想装其他设置繁琐的防火墙,但又希望系统有最大限度的安全保障的话,可以考虑使用国外的F-Secure Anti-Virus Client Security或者BitDefender Professional,都是杀毒软件+防火墙的组合装。个人更看好F-Secure Anti-Virus Client Security,集合AVP,LIBRA,ORION,DRACO四套杀毒引擎+内置防火墙+反间谍监控程序,可以说各方面功能都比较均衡实在,怕麻烦的朋友们不仿可以考虑一下。但是这个软件只有英文原版的,但是我想英文界面也并非那么令人望而却步吧。

其实对于杀毒软件除了国内的,国外的杀软建议大家都使用英文原版的,那些汉化内核的版本最好别用,bug太多,除了真正出过简体中文版本的,不过我个人还是不喜欢,呵呵。

另外我需要强调一点的就是卡巴其实并不适合每个人,大家应该依照自己的实际情况装杀毒软件,卡巴占用系统资源更象暴发户,所以很容易拖垮电脑,如果自己电脑配置本身就不高,CPU处理器能力也不强,或者内存就256MB那么点,我想还是算了吧,毕竟装了以后你才知道什么叫慢,开了个卡巴,除了得到我系统应该很安全了这样的心里安慰,其他事情都不能做,开个大程序就卡,玩个游戏载入要老半天,这又何苦呢?与其这样,我宁可欣赏飘哥的做法,撒杀毒软件也不装,就搞个防火墙玩玩,毕竟节省资源啊!敢于裸奔电脑上网的用户我就更服帖了!

我写这篇文章就是希望大家不要盲目跟风,卡巴是好卡巴是比较牛,但不是意味着就要一窝蜂都去装卡巴,何必呢,天下杀毒软件如此之多,何必单恋他一个呢?大家说对伐?

每天都要在十大破解论坛上逛一圈,也看过不下500篇关于描述杀毒软件描述的文章,也几乎试用过几乎市面上所有的杀毒软件 和防火墙。。。(代价:这台今年初才买的电脑,已经重新装过两次系统了,机器每天重启N次)以下只是本人个人的一些体会,希望对大家挑选杀软有些启发和帮助。

首先 你要明确自己上网的目的,如果只是开开网页 上上QQ 听听歌什么的,金山 瑞星等等这些杀软对你来说足够了!

其次 用杀软(杀毒软件,下面都简称杀软)首先要自己喜欢,用得习惯。再好的杀软不会用,用不好。。装在你机器上是发挥不出效果,只是摆设!

最后 每个杀毒软件都有自己的长处和短处,只有更好,没有最好!对电脑配置要求高低不等,要根据自己的电脑配置来选! 只要适合自己就好,不要盲目跟风,今天用这个,明天用那个,这样对机器损耗太大,卸载杀软是会留下很多垃圾的.

在这里说个笑话,我有个朋友, 看我换了N个杀毒软件,老问我: 你是不是有洁癖啊?!! 更夸张的是有个联想公司的工程师到我家来玩,看到我D盘 E盘一硬盘的杀毒软件,吓了一大跳:我靠哪有这么多病毒来给你杀啊!

一。发烧友类型(算得上是杀软综合征的)

①机器配置比较高的

推荐: 卡巴司机+LOOK, 两个世界排名第一的软件,杀毒 防火墙都是NO.1, 没得话讲的. 顺便加上个 买咖啡或KV进行实时监控, 买咖啡实时监控世界NO.1

平常用买咖啡进行实时监控. 注:McAfee8.0i可以自由安装组件,所以可以只安装扫描器和更新器,那样就可以打McAfee的反间谍模组,只要不按装McAfee的监控器(按访问扫描)

嫌麻烦的话平常就用KV监控,卡巴只用来每周扫一次, 也有用MCAFEE的MM组合+ad-aware

条件:内存512吧,对电脑要有一定知识

②普通配置(内存256,P4之类)

推荐: 卡巴司机+ZA或OP 或买咖啡+ZA(ZoneAlarm)或OP(outpost)

既然身为发烧友, 杀毒当然马虎不得

条件:卡巴最好用单机5.0.227版(这个版本最快)

附:卡巴和买咖啡的比较:

卡巴是一群技术狂热分子在实验室搞出来的,虽然他们有技术,但他们得不到MS的源码,所以虽然有很好的引擎,但在监控的稳定性,兼容性上一直不太好.并且他们是典型的技术派,根本就不会做市场,用户多是一些病毒狂热分子(包括病毒作者,看见病毒包就拿来试杀软的人以及杀软升级综合症患者).而咖啡是一家大型的专业的安全软件公司,他的引擎是收购的和卡巴齐名的所罗门的引擎,再加上MS的源码,所以咖啡的监控在稳定性和兼容性上是卡巴比不了的.

对于杀毒能力,卡巴确实要强,这与他们是技术派是有关系的.而咖啡的用户主要是企业,并且他们在美国,如果杀坏用户的文件是要赔很多钱的,所以在杀毒上他们比较谨慎(norton比咖啡更保守).

看个人喜欢了呵呵,其他的别装多了, 影响机器运行的,想想你的电脑配置吧!你总要用电脑做些其他事情吧?!(现在魔兽世界已经内测了,对机器要求很高的哦)

(本人用的是卡巴+ZA,一直很稳定)

②电脑配置较差

推荐:KV2005+天网

国产组合中最好的了(国产的KV杀毒最好, 国产的防火墙天网最强)

呵呵,对机器要求比洋货低多了,只有他们杀毒能和洋货比一比! 而且KV和天网毕竟是国内的,对付国内木马更地道些

条件:最好都是可以在线升级版本,再好的杀软不能在线升级,就没一点用

二. 游戏用户

这类人对网速要求高,一定要突出网速! !

推荐:卡巴+XP2自带防火墙

配置差的就用KV+XP2自带防火墙

不要小瞧了XP2自带的防火墙,其实性能不错的.只要注意平时自动更新,打打补丁,应付一般攻击都可以的!而且所有防火墙对网速都有影响地, 只有XP2自带的防火墙速度最快!!!

缺点:微软可是众矢之的,成千上万的黑客都是针对他的,现在XP2自带防火墙也许还行,但是过一段时间后就会漏洞百出. $[ s9Y7p l0u @"h

如果不放心,就加个KV或瑞星或金山的防火墙 在防火墙上国产的都差不多的,只所以推荐他们 是因为这几款软件的防火墙对网速限制不高,我们要的就是速度,速度!在这里不推荐天网, 天网对网速有影响(当然,如果你的ADSL速度快,装天网也行,我只是针对网速慢一点的朋友)

如果不放心,在以上基础上,再加个木马客星之类的小巧一点专门对付木马的工具(主要是防止盗窃游戏密码的木马)

三. 图省事的朋友

瑞星2005+防火墙或金山毒霸6+金山网标 , 再加个3721上网助手

条件:对电脑懂得实在不多,平常要忙于其他!

几个老牌子了,信誉还是不错地, 应付你平常上上小网也足够了!而这两款软件应付国内木马病毒反映还是很迅速的,而且破解版最多(不象KV打击盗版打击得好严)他们相当相当好找,杀毒速度又快,界面又好看又容易操作, 我们图的就是个省心!

四 其他杀毒软件

象诺顿 F-Secure AntiVir 趋势之类的....

在国际上他们比不上卡巴 比不上买咖啡, 在本土上他们做不过KV ....又比较吃内存,所以不推荐....用他们就主要看个人习惯了, 还是那句话:首先要自己喜欢,用得习惯。再好的杀软不会用,用不好。。装在你机器上是发挥不出效果,只是摆设罢了!

手把手教你定制一套适合团队的微前端体系

编者按:大家在使用目前市面上的微前端解决方案时,可能会有些顾虑。比如遇到框架自身的问题和坑点,影响了业务进度怎么办?现在有这么一款框架Satum,可以像express/koa框架一样提供中间件机制,其只负责核心的功能(规则计算和微应用加载/卸载)。可以基于该框架定制一套适合团队自身业务的微前端体系,另外该框架还有更多特性,如面向多实例集成、适配多终端等。

写在前面

随着前端工程复杂度逐渐增加,业务复杂的前端项目需要拆分成多个项目来维护。还有就是业务存在了3-5年,一些技术栈没及时升级,已经无法在其基础上做开发,需要搞个新项目一起集成。又或者是想通过新业务,对新技术/框架最新大版本试用。遇到上述场景(当然不限这些场景,还有更多场景待挖掘),大家也许会把目光转向微前端方案。

市面上也有一些微前端框架的实现,但黑盒化太严重。遇到问题/坑点,只能等框架的作者修复了才能正常工作。但业务开发时真正遇到了问题,如果寄希望于框架作者/社区,会不会感到凉凉?

本篇我们基于Satum定制一套微前端体系出来。Satum是一款面向多实例集成、功能可插拔的微前端框架,旨在解决多实例模式的微前端场景(当然单实例也包含其中)。即多个微应用被同时激活时,该如何协调加/卸载、数据依赖、组件共享及渲染顺序的问题。且支持中间件&插件机制,可以很方便自定义沙箱、路由协调、缓存等。通过不同的中间件&插件组合,可以定制适合自己团队的微前端架构体系。

Satum的优势(相较于社区常用的方案qiankun和micro-app):

:完全支持,?:不支持,?:弱支持

Satumqiankunmicro-app使用简单,无需适配代码即可集成无需适配强依赖需要扩展性,控制流程中的输入或输出定制化,支持定制适合业务的微前端体系多应用同时激活,微应用调度和路由协调支持极弱规则限制挂载点基于路由规则,同个应用可渲染到页面不同处多终端支持,相同URL在不同端激活不同的微应用共享机制,支持共享三方包和组件强弱弱区块机制,可以加载任意UI组装页面支持Vite,沙箱环境中无缝支持微前端体系

微前端体系包含微前端框架、配置中心、微应用开发配套工具及配套服务、物料市场、低代码平台等。体系示例图如下:

带来的好处

微前端体系带来的好处不言而喻,简单说来,使用该体系可以将一个大型项目拆分成多个子项目,每个子项目各自独立,互不影响,又互相关联。核心价值是什么呢?

技术栈无关主框架不限制接入应用的技术栈,微应用具备完全自主权

独立开发、独立部署微应用仓库独立,前后端可独立开发,部署完成后主框架自动完成同步更新

增量升级在面对各种复杂场景时,通常很难对一个已经存在的系统做全量的技术栈升级或重构,而微前端是一种非常好的实施渐进式重构的手段和策略

独立运行时每个微应用之间状态隔离,运行时状态不共享

所需的工程板块

从上述体系架构图可以很清楚地看到,我们需要以下工程板块:

微前端框架

建议利用@satumjs/core的定制化能力,打造适合团队的微前端框架。不太建议使用市面上黑盒化的微前端框架。这样做,可以利用其中间件/插件机制,定制个性化的微应用处理逻辑。

配置中心

所谓配置中心,其实是一个可视化的json编辑。如果有个线上的配置中心,可以灵活控制业务板块的热更新。有些业务需求,不需要修改和发布代码就能达到目的。

微应用开发配套工具及配套服务

配套工具和服务太重要了,因为我们开发的微应用不是完整的业务,有些功能模块甚至是从其他微应用共享而来。虽然微应用可以独立运行和部署,但开发过程中,还是需要及时看到集成后的效果。

物料市场

这块主要是基础组件和业务组件,可以是基于ant-design或其他design搞的组件家族。

低代码平台

微前端能够集成低代码平台生成的页面,我觉得也很必要。这样的好处是扬长避短,低代码平台一般不太建议搭建业务复杂的页面,所以单独存在的低代码平台意义有限;而纯代码打造的平台工期较长,需要的前端能力也较高;如果能够做到简单页面低代码实现,复杂逻辑纯代码实现,然后集成在一起,是最理想的方案。

使用后达到的目标

微应用合理分拆,独立运行和部署,降低整体复杂度;

技术库无关,可以根据业务需要尝试各种组件库和技术栈;

增量升级,新老系统可以集成在一起,新系统负责新业务功能;

多终端适配,Satum支持同一个URL不同终端唤起不同的微应用;

单一职责,让诸如React/Vue等只做视图方面的事情,业务逻辑在其他微应用上承载;

可自行定制沙箱、代码处理、路由协调等功能;

如何定制初始化项目新建文件夹,添加必要的依赖

新建文件夹mf2e-test,通过命令echo{}>package.json或yarninit初始化package.json。我们使用rollup做构建工具,需要先安装构建相关的依赖。

yarn?add?rollup?@rollup/plugin-babel?@rollup/plugin-commonjs?@rollup/plugin-node-resolve?rollup-plugin-dts?rollup-plugin-terser?@babel/cli?@babel/core?@babel/preset-env?@babel/preset-typescript?typescript?rimraf?--dev

之后再创建构建相关的配置文件.babelrc、rollup.config.js、tsconfig.json

{"presets":?[?"@babel/typescript",?"@babel/preset-env"]}import?commonjs?from?'@rollup/plugin-commonjs';import?{?nodeResolve?}?from?'@rollup/plugin-node-resolve';import?{?babel?}?from?'@rollup/plugin-babel';import?{?terser?}?from?'rollup-plugin-terser';import?dts?from?"rollup-plugin-dts";import?*?as?pkg?from?'./package.json';

constextensions=['.js','.ts'];constplugins=[commonjs(),nodeResolve({extensions}),babel({extensions,include:['./src/*/']}),terser(),];

constumdConfig={input:'src/index.ts',//此处name是会在window上附加,需注意请自定义output:{dir:'lib',name:'mf2eTest',format:'umd'},plugins,};

constesConfig={input:'src/index.ts',external:Object.keys(pkg.dependencies),output:{file:'lib/index.es.js',format:'es'},plugins,};

constdtsConfig={input:'./src/index.ts',output:{file:'./lib/index.d.ts',format:'es'},plugins:[dts()]}

exportdefault[umdConfig,esConfig,dtsConfig];

```json{?"compilerOptions":?{"module":?"es2015","target":?"es5","lib":?["esnext",?"dom"],"baseUrl":?"./src","esModuleInterop":?true,"noImplicitAny":?true,"strictNullChecks":?true,"noImplicitReturns":?true,"noFallthroughCasesInSwitch":?true,"noUnusedLocals":?false,"noUnusedParameters":?true,"suppressImplicitAnyIndexErrors":?true,"allowSyntheticDefaultImports":?true,"emitDecoratorMetadata":?true,"experimentalDecorators":?true,"removeComments":?true,"sourceMap":?true,"declaration":?true,"outDir":?"./lib","allowJs":?true,"moduleResolution":?"Node"?}}创建源码文件夹src,添加入口文件index.ts

创建文件夹src,作为源码文件夹,并在其中添加入口文件index.ts。做完这些事情,我们的文件夹看起来应该是这样:

mf2e-test?|-?src|-?index.ts?|-?.babelrc?|-?package.json?|-?rollup.config.js?|-?tsconfig.json

这时候我们可以安装框架逻辑需要的依赖了,执行下面命令:

yarn?add?@satumjs/core?@satumjs/simple-midwares?@satumjs/midware-single-spa

我们可以测试下es6的源码是否能够正常构建出es5的代码,当然在此之前package.json里要添加一些scripts

"scripts":?{?"build":?"rimraf?lib?&&?rollup?-c",?"build:w":?"npm?run?build?--?-w",?"pub":?"npm?run?build?&&?npm?publish?--access?public"},

之后请在index.ts里添加如下代码,然后执行命令yarnbuild可以看到能正常生成代码。

import?{?register,?start?}?from?'@satumjs/core';export?{?register,?start?};

那么到此,恭喜你,初始化工作告一段落,我们提交一下代码。

添加必要的中间件

@satumjs/simple-midwares是一些中间件的集合,包含了常用的中间件如缓存、沙箱、css隔离、获取挂载dom、路由协调等。我们可以先使用其中的沙箱、获取挂载dom这两个中间件。然后我们还要使用@satumjs/midware-single-spa中间件协助管理微应用的加载和卸载(你可以不使用该中间件,内置有实现简单的single-spa功能,不过强烈建议使用)。index.ts修改代码如下:

import?{?register,?start,?use?}?from?'@satumjs/core';import?{?simpleSandboxMidware,?mountNodeMidware,}?from?'@satumjs/simple-midwares';import?singleSpaMidware?from?'@satumjs/midware-single-spa';use(simpleSandboxMidware);use(mountNodeMidware);use(singleSpaMidware);export?{?register,?start?};

做完这一步,其实我们可以执行一下yarnlink,搞个本地示例工程出来直接看该框架的实际运行情况了。本地示例工程请参考,换一下依赖@satumjs/core为mf2e-test即可。

添加微应用本地调试工具

所谓调试工具,其本质是获取到微应用的配置后,如果调试whiteList里包含该微应用,则使用whiteList里的entry地址,而这个地址可以指向本地启动的微应用。所以我们继续在index.ts里添加逻辑,我以whiteList存储在localStorage里为例。

use((system,?microApps,?next)?=>?{?system.set(MidwareName.proxyEntry,?(entry:?string?|?string[],?appName:?string)?=>?{const?proxyMap?=?{};const?proxySetting?=?localStorage.getItem('proxyEntries')?||?'';const?proxyData?=?proxySetting.replace(/\s/g,?'').split(',');proxyData.forEach((item)?=>?{?const?[itemAppName,?proxyUrl]?=?item.split('|');?if?(itemAppName?&&?proxyUrl)?proxyMap[itemAppName]?=?proxyUrl;});const?currentApp?=?microApps.find((item)?=>?item.name?===?appName);return?currentApp?&&?proxyMap[appName]proxyMap[appName]?:?entry;?});?next();});

这样你往浏览器的localStorage里添加形如micro-name|micro-entry-url规则,当框架加载微应用时就会使用本地启动的。多个可以以,隔开。

添加跨域服务,以方便远程非跨域微应用集成

好多时候,我们把微应用部署到开发、测试、预发等环境,可能是直接部署到了cdn上。这些环境并不支持跨域,进而影响集成。我们可以自己搞个跨域服务出来,做一下中转,然后方便微应用集成。框架层面上也要做下支持,其实本质是遇到微应用的entry,为其加一层跨域中转请求。

{"presets":?[?"@babel/typescript",?"@babel/preset-env"]}0

代码编写到这个地方,恭喜你,微前端框架部分就完成了。不过作为框架,需要让用户可以传一些参数进来,控制一些中间件的行为。整体代码如下:

{"presets":?[?"@babel/typescript",?"@babel/preset-env"]}1

微前端框架示例仓库请访问创建配置中心

最简单的是,发一个json文件到cdn。当然可以使用nodejs搭建一个可视化编排json的配置中心出来,这样可以做到不用修改代码,即可上下线微应用。

物料市场

可以使用业界开源的x-design来做基础组件库,根据业务定制一些业务组件出来。这些组件可以在微应用里通过共享,分发到其他子应用。

低代码平台

需要自行实现该平台,然后基于satumjs强悍的集成能力,把分散的页面集成到一个网站下。

后续

本文通过代码的方式一步步定制出一套微前端框架(示例仓库,然后又把该框架周边最常用的工具的实现展现了出来。还有一些工程板块,可以自行搭建,也可以使用公司或开源的。如果大家对Satum感兴趣,欢迎访问其官网了解更多。如果对中间件和插件感兴趣,官网上也有一些资料。建议大家加微信群或钉钉群,方便后续交流。感谢大家耐心阅读这篇文章~

原文: