Giter Site home page Giter Site logo

doocs / advanced-java Goto Github PK

View Code? Open in Web Editor NEW
74.3K 2.6K 18.8K 32.74 MB

😮 Core Interview Questions & Answers For Experienced Java(Backend) Developers | 互联网 Java 工程师进阶知识完全扫盲:涵盖高并发、分布式、高可用、微服务、海量数据处理等领域知识

Home Page: https://doocs.github.io/advanced-java

License: Creative Commons Attribution Share Alike 4.0 International

Java 100.00%
java distributed-systems message-queue redis distributed-search-engine high-availability high-concurrency dubbo zookeeper rpc

advanced-java's Introduction

互联网 Java 工程师进阶知识完全扫盲

stars forks license doocs

本项目大部分内容来自中华石杉,版权归作者所有,内容涵盖高并发分布式高可用微服务海量数据处理等领域知识。我们对这部分知识做了一个系统的整理,方便读者们学习查阅。

我们也在全力更新算法项目!如果你在准备笔面试算法,或者想进一步提升 coding 能力,欢迎 Star 关注 doocs/leetcode

学习本项目之前,先来看看 Discussions 讨论区的技术面试官是怎么说的吧。本项目欢迎各位开发者朋友到 Discussions 讨论区分享自己的一些想法和实践经验。也不妨 Star 关注 doocs/advanced-java,随时追踪项目最新动态。

高并发架构

缓存

分库分表

读写分离

高并发系统

分布式系统

系统拆分

分布式服务框架

分布式锁

分布式事务

分布式会话

高可用架构

高可用系统

  • 如何设计一个高可用系统?

限流

熔断

降级

  • 如何进行降级?

微服务架构

Spring Cloud 微服务架构

海量数据处理

Stars 趋势

Stargazers over time

注:本趋势图由 actions-starcharts 自动定时刷新,作者 @MaoLongLong


Doocs 社区优质项目

Doocs 技术社区,致力于打造一个内容完整、持续成长的互联网开发者学习生态圈!以下是 Doocs 旗下的一些优秀项目,欢迎各位开发者朋友持续保持关注。

# 项目 描述 热度
1 advanced-java 互联网 Java 工程师进阶知识完全扫盲:涵盖高并发、分布式、高可用、微服务、海量数据处理等领域知识。
2 leetcode 多种编程语言实现 LeetCode、《剑指 Offer(第 2 版)》、《程序员面试金典(第 6 版)》题解。
3 source-code-hunter 互联网常用组件框架源码分析。
4 jvm Java 虚拟机底层原理知识总结。
5 coding-interview 代码面试题集,包括《剑指 Offer》、《编程之美》等。
6 md 一款高度简洁的微信 Markdown 编辑器。
7 technical-books 值得一看的技术书籍列表。

贡献者

感谢以下所有朋友对 Doocs 技术社区 所做出的贡献,参与项目维护请戳这儿

公众号

Doocs 技术社区旗下唯一公众号「Doocs」​,欢迎扫码关注,专注分享技术领域相关知识及行业最新资讯。当然,也可以加我个人微信(备注:GitHub),拉你进技术交流群。



关注「Doocs」公众号,回复 PDF,即可获取本项目离线 PDF 文档(283 页精华),学习更加方便!


advanced-java's People

Contributors

acbin avatar apollyon0728 avatar caiquan-github avatar chenqimiao avatar cuidq avatar franklingu avatar frederick-s avatar hai046 avatar huifer avatar imgbotapp avatar jamescheng16 avatar kid1412621 avatar lianghao208 avatar liorocky avatar liukun2634 avatar naah69 avatar oliverwqcwrw avatar sincof avatar sishuoyang avatar stardustman avatar tgpcai avatar thebestflyingpig avatar thinkasany avatar tonywangcn avatar xt-ma avatar yanglbme avatar yanwankun avatar ybd0612 avatar z-beatles avatar zhenghaeho avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

advanced-java's Issues

缓存雪崩与缓存穿透的问题

缓存雪崩的问题:

缓存雪崩的事前事中事后的解决方案如下。
事前:redis 高可用,主从+哨兵,redis cluster,避免全盘崩溃。
事中:本地 ehcache 缓存 + hystrix 限流&降级,避免 MySQL 被打死。
事后:redis 持久化,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。

redis 重启后从磁盘上加载的数据应该都是过期的数据了吧?和数据库不一致了。

缓存穿透的问题:

举个栗子。数据库 id 是从 1 开始的,结果黑客发过来的请求 id 全部都是负数。这样的话,缓存中不会有,请求每次都“视缓存于无物”,直接查询数据库。这种恶意攻击场景的缓存穿透就会直接把数据库给打死。
解决方式很简单,每次系统 A 从数据库中只要没查到,就写一个空值到缓存里去,比如 set -999 UNKNOWN。这样的话,下次便能走缓存了。

感觉这样并没有解决缓存穿透的问题,黑客只需要把每次请求id设置为不一样的负数就可以了

项目本地查看

请问项目中这种 /images/xxxxx.png路径的图片,在本地用什么软件能加载出来

单词拼写有误

dubbo序列化协议介绍中,新添加的对于PB的介绍,protocol单词拼写错误。
protocal -->protocol

Doocs 微信交流群 | Wechat group for Doocs

  1. 微信群禁止一切垃圾广告信息,包括小程序助力信息、小游戏、社群推广、公众号推广、支付宝推广码等;
  2. 交流 GitHub、开发相关,可以自由分享开发相关知识,不提倡整天水群;

更新目前群人数已超 100,可添加我私人微信(备注:个人姓名+来自 GitHub,微商广告党勿加),私聊我拉入 Doocs 交流群。

移动端阅读利器【微信小程序】

嗨各位,为了给大家提供在移动端设备上更好的阅读体验,最近我专门针对这个仓库在我的微信小程序进行了优化,使得本仓库的绝大部分文章都能在该小程序内正常阅读(包括图片),请大家扫码试用

QRCode

该小程序完全开源免费(不含广告),如果使用过程中有什么不愉快或者建议,可在 此处 开 Issue 提建议,多谢🙏

部分截图

Feeds Issues Trendings Pulls Profile
feeds my-issues trendings my-pulls user
Search Repos Search Users Repo Detail Repo Detail Issue Detail
search-repos search-users repo-readme repo-issues issue-detail
Followers Following My Repos My Starred Sign In
followers following my-repos my-starred sign-in

【开源项目维护】一起吗? | Want to join us?

英雄招募

成为 Doocs 项目维护者

本项目 advanced-java,包括 Doocs 开源组织下的所有项目,都欢迎各位朋友参与完善。

如果你提交的内容有价值,且具备规范性,将有机会提升为项目的维护者,直接参与项目的 review、merge 等维护工作,提交内容时也可以直接 pushdoocs/advanced-java 主分支 master 下,无须提交 PR 等待 review。

目前 advanced-java 只有 yanglbme 一人维护,很欢迎你们加入,与 yanglbme 一起并肩作战。当然,Doocs 下其它所有项目,如 leetcode、technical-books 等同样欢迎。

image

我要怎么做才能成为 Doocs 项目的维护者?

  • 提交的内容必须有价值,且有规范性。规范性包括:文件命名、Git 提交信息、文件存放位置等等,具体要求可以参考提交注意事项。当然这里提到的注意事项也普遍适用于 Doocs 其它项目。
  • 保持一定的活跃度。Doocs 不能因为你的一次提交就直接把你加入到开源项目维护者中,希望你对开源项目有更多的参与。这样后面 Doocs 才能放心把项目交予你维护。
  • 细心,注重审美,有代码或文档洁癖。

只限定目前 Doocs 的那几个项目吗?

绝不限于 Doocs 当前的项目。只要你有好的 idea,想创建新的项目,并作为项目的主维护者,都是可以的。你甚至可以把你个人名义下的项目 transfer 到 Doocs 开源组织下进行维护。前提是,你的项目符合 Doocs 的定位,确实能在一定程度上帮到其它朋友,并且项目规范、有较好的文档结构和说明。

...

Doocs 期待你们的加入 :)

贡献者列表

感谢以下所有为开源组织 Doocs 做出贡献的朋友,没有你们的参与,开源组织不可能做好。

contributors

欢迎加入 Doocs 开源组织 | Welcome to join the Doocs Open Source organization

Introduction

GitHub license gitter

Hello, everyone! Welcome to the Doocs Open Source organization. The name is originated from ‘Docs’, which mainly shares various development-related knowledge in the form of documents.

See the 中文文档 for Chinese README.

Links

Owner

Yang Libin, a backend development engineer.

Projects

Doocs now has the following projects:

# Project Description
1 advanced-java A learning roadmap of advanced knowledge for Java developers.
2 technical-books Awesome programming books list.
3 jvm A summary of the underlying principles of Java Virtual Machine.
4 leetcode LeetCode solutions in any programming language.
5 coding-interview A collection of interview questions for programmers. The main contents include ‘Coding Interviews: Questions, Analysis and Solutions’, ‘Beauty of Programming’, etc.
6 spider A record of crawler-related knowledge points.
7 data-structure-and-algorithm Knowledge about data structures and algorithms.
8 awesome-python A collection of (mostly) technical things every pythoner should know.

How to join

If you want to go fast, go alone. If you want to go far, go together.

I believe many of you have a deep understanding that participating in open source projects is very helpful for personal growth. If you love open source or you are curious about it, join Doocs, work with us, maintain our projects and grow together. You can join us in the following two ways:

By default, your Doocs membership will be hidden from view aftering joining us. If you'd like to display the organization icon in your profile, you can switch from "Private" to "Public" here: https://github.com/orgs/doocs/people. We also recommend setting it to Public.

Note: At the beginning, you will not have direct 'write' permission for the project at this time, because we are not sure that your submission meets the project specifications.

However, you can fork any of the items of your interest to your personal GitHub account and make changes to the project. You can submit your PR once you have modified the code or document, and then the Doocs maintainer will review your submission. It's normal that your initial submission is not standardized, however, it would be improved after practice. When your submissions consistently meet the project standards, the Doocs maintainer will add you to the Collaborators list of corresponding projects to maintain them together with us.

You can refer to this article if you are a new open-source contributor.

Doocs is looking forward to your joining.

Contributors

This organization exists thanks to all the people who contribute.

如何设计可以动态扩容缩容的分库分表方案 一个疑问

  1. 由 dba 负责将原先数据库服务器的库,迁移到新的数据库服务器上去,库迁移是有一些便捷的工具的。
    总结的第四点,在第三点中成倍扩容之后,为什么需要进行库迁移?而不是根据新的路由规则,将新的数据写入新的库呢?

作者的内容只能稍微用来参考,回答的不仅不全面,而且只侧重表明。 例如:如何保证消息不被重复消费?或者说,如何保证消息消费的幂等性?

如何保证消息不被重复消费?或者说,如何保证消息消费的幂等性?
消息重复产生可能出现在2个位置,一个是消息发送端的重复发送,一个是消息到达了消息存储,由消息中间件重复投递产生错误。 消息的重复存储也会导致消息重复投递,而被重复消费,可以在消息发送至存储前给消息加入唯一ID,保证存储的唯一性。而针对重复投递的消息,有两种方式,一个是可以采用分布式事物来解决,一个是消息接收者的操作是幂等操作。

缓存与数据库的双写一致性的问题

我想问下 对于队列处理数据库更新的操作 缓存是如何返回呢 如果是读不到睡眠的话 是不是会存在睡眠中缓存更新了又有更新请求进来 又把缓存删了的问题 导致一直读不到缓存?

未来之路 | The future path

未来之路

来自 @mercyblitz (小马哥)

懂得取舍

  • 挑选书籍
  • 学习源码
  • 职业规划

学会判断

  • 使用场景判断
  • 发展趋势判断
  • 可行性判断

学习方法

  • 多看(代码、规范、论文)
  • 多写(模仿、比较、超越)
  • 多思考(正向、逆向、跳跃)
  • 少废话(吹牛、装逼、叫大哥)

ES深度分页问题

该文章提到的深度分页问题还有一种解决方法:
使用 Search After。
局限是:不能指定页数,只能下一页的查询。需要指定sort值,并且唯一

关于rabbitMQ的顺序

感觉大神的分享,之前也遇到了相关的问题,但是感觉没有你这里说的这么复杂。这次看到这里的说法就自己写了个demo。

    advanced-java/docs/high-concurrency/how-to-ensure-the-order-of-messages.md

只是纯粹的使用了springboot 然后开启了一个helloObj的队列,之后循环发了10个消息
开了1个hello的监控,但是不知道为什么。。。不知道能否帮忙解答一下这块。。,代码大致如下

代码大概意思是循环10次,发送0-9的ID过来,按理说消费的时候顺序也是0-9的,但是为什么我的无序的情况

配置部分,这里只看helloObj
image

模拟生产消息
image

image

消息消费部分
image

打印的结果,红色部分是消息id
image

网上一直没查到是啥原因。。但是看您的文章里说的只要是1个队列1个消费者就可以了。。我感觉我这里也是这样的。。就不知道为什么会出现顺序不一直的情况。。

关于distributed-system-request-sequence.md(分布式服务接口请求的顺序性如何保证?)文章中的问题

按照文中的操作,同一个订单最终落到同一条数据,然后把请求丢到内存队列,这样还是会有问题,如果请求2和请求3先于请求1到达服务器,还是会先执行2,3请求,再执行1请求。这种情况下可以基于业务来定义,将同一个订单的请求基于业务的先后顺序丢到不同队列中,要求业务优先的执行完才能执行下一个请求,如果下一个请求还没过来,可以阻塞等待,不过这样做的话会导致吞吐量下降。还是按照题主的建议,将这种业务合在一个请求之中处理比较好。

插入之后又查询是否可以省略

列如:我在前端提交的数据如果成功的话,就可以直接使用提交的数据来进行展示呀。就不再需要重新查询一遍。是这样吗?

建议:是否能新增下微服务专题的内容

看到你github的文章,很受益,看是否能新增下微服务springcloud的相关内容。
微服务,是当前热门的内容,能否针对相关springcloud的相关服务治理展开相关常用内容普及。

疑问:关于“ RabbitMQ 弄丢了数据” 的说法

持久化可以跟生产者那边的confirm机制配合起来,只有消息被持久化到磁盘之后,才会通知生产者ack了,所以哪怕是在持久化到磁盘之前,RabbitMQ 挂了,数据丢了,生产者收不到ack,你也是可以自己重发的。

注意,哪怕是你给 RabbitMQ 开启了持久化机制,也有一种可能,就是这个消息写到了 RabbitMQ 中,但是还没来得及持久化到磁盘上,结果不巧,此时 RabbitMQ 挂了,就会导致内存里的一点点数据丢失。

既然是在“confirm”机制的前提下,RabbitMQ 开启了持久化机制 ,通知生产者ack了,那么消息是不是就不会丢失了呢

分布式服务接口请求的顺序性如何保证?

分布式服务接口请求的顺序性如何保证?你举例中说服务 A 调用服务 B,先插入再删除。我觉得调用服务B的时候就要保证它的顺序性,不然会出错,就是同步调用。不会出现两请求都过去。还是我理解不到位,请解释下。

redis-consistence.md 中 Cache-Aside Pattern 相关

Cache-Aside Pattern 更新的时候,不是先更新数据库,然后才淘汰缓存吗?

参考文章
参考的片段:
If an application updates information, it can emulate the write-through strategy as follows:

  1. Make the modification to the data store
  2. Invalidate the corresponding item in the cache.

MQ中的kafka高可用描述不完整

MQ

如上圈起来的地方,“如果这上面有某个partition的leader”,应该修改为“如果这上面有某个partition的leader挂掉了”

图片在本地不能正常显示的问题

fork项目后,把项目拉倒本地用idea查看(因为用github比较卡,即使用了Octotree查看还是不太方便),结果图片不能正常显示。在markdown中是存在这样的问题,不知道有没有什么好的解决方案

消息队列,为什么使用消息队列?文章中的一个mq使用建议:

原文: 不过现在确实越来越多的公司,会去用 RocketMQ,确实很不错(阿里出品),但社区可能有突然黄掉的风险,对自己公司技术实力有绝对自信的,推荐用 RocketMQ,否则回去老老实实用 RabbitMQ 吧,人家有活跃的开源社区,绝对不会黄。

文中关于RocketMQ突然黄掉的风险,应该不会了,目前阿里RocketMq 已捐赠至Apache基金会。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.