首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Linkerd2 proxy tap 学习笔记

Linkerd2 proxy tap 学习笔记

作者头像
CNCF
发布于 2019-12-04 06:56:06
发布于 2019-12-04 06:56:06
1.2K00
代码可运行
举报
文章被收录于专栏:CNCFCNCF
运行总次数:0
代码可运行

作者: 哗啦啦 mesh团队,热衷于kubernetes、devops、apollo、istio、linkerd、openstack、calico 等领域技术。

概述

Linkerd2由控制平面数据平面组成:

  • 控制平面是在一个专门的Kubernetes命名空间(默认是linkerd)中运行的一组服务,这些服务共同实现了聚合遥测数据、提供一组面向用户的API、向数据平面提供控制指令等功能。
  • 数据平面由一组用Rust编写的轻量级代理组成,它们安装在服务的每个pod中。它通过initContainer配置iptables来接管Pod的所有出入流量。它对服务毫无侵入,服务本身不需要修改任何代码,甚至可以将它添加到正在运行的服务中。

以下是官方的架构示意图:

proxy-destination

tap是Linkerd2的一个非常有特色的功能,它可以随时抓取某资源的实时流量。有效的利用该功能可以非常方便的监控服务的请求流量情况,协助调试服务。

tap相关的功能组件如下:

  • web/CLI: 发起tap请求,展示tap监控结果
  • tap: 将来自web/CLI的tap请求转为gRPC请求并发至proxy组件,将proxy回复的tap事件回复给web/CLI
  • proxy: 处理tap请求,从经过的request/response数据中获取需要的信息,组成tap事件上报

前两者逻辑相对简单,此处主要关注proxy与tap组件交互相关的一些逻辑,简单分析proxy内部的运行逻辑。

注:本文基于Linkerd2 stable-2.6.0版本,linkerd-proxy v2.76.0版本。

初始化

首先是初始化,在build_proxy_task中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let (tap_layer, tap_grpc, tap_daemon) = tap::new();

进入tap::new()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    let (daemon, register, subscribe) = daemon::new();
    let layer = Layer::new(register);
    let server = Server::new(subscribe);
    (layer, server, daemon)

此处创建了如下3个对象:

  • tap_layer 用于后续的 inboundoutbound 逻辑,及后续请求处理
  • tap_grpc 用于 TapServer 创建,处理tap组件的grpc请求
  • tap_daemon 则作为任务正常运行,负责黏合layer与grpc

下面分别介绍。

`tap_daemon`

进入daemon::new()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    let (svc_tx, svc_rx) = mpsc::channel(super::REGISTER_CHANNEL_CAPACITY);
    let (tap_tx, tap_rx) = mpsc::channel(super::TAP_CAPACITY);

    let daemon = Daemon {
        svc_rx,
        svcs: Vec::default(),

        tap_rx,
        taps: Vec::default(),
    };

    (daemon, Register(svc_tx), Subscribe(tap_tx))

注意此处分别创建svc通道和tap通道,并且将两通道的接收端都存于tap_daemon中,然后将svc的发送端定义为新类型Register的实例,将tap的发送端定义为新类型Subscribe的实例。

在主逻辑中,通过tokio框架执行daemon任务:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        tokio::spawn(tap_daemon.map_err(|_| ()).in_current_span());

Daemon::poll中(见linkerd2-proxy/linkerd/app/core/src/tap/daemon.rs:60,保留骨干):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        // 只保留未完成的tap
        self.taps.retain(|t| t.can_tap_more());
        for idx in (0..self.svcs.len()).rev() {
            // 剔除状态不对的svc
            if self.svcs[idx].poll_ready().is_err() {
                self.svcs.swap_remove(idx);
            }
        }

        // 获取svc(即tap_layer中创建的 tap2_tx)
        while let Ok(Async::Ready(Some(mut svc))) = self.svc_rx.poll() {
            for tap in &self.taps {
                // 将tap发至tap2_tx
                let err = svc.try_send(tap.clone()).err();
            }

            if !dropped {
                // 保存tap2_tx
                self.svcs.push(svc);
            }
        }

        // 获取打包的tap及一个一次性的信号通知通道ack
        while let Ok(Async::Ready(Some((tap, ack)))) = self.tap_rx.poll() {
            for idx in (0..self.svcs.len()).rev() {
                // 将tap发至tap2_tx
                let err = self.svcs[idx].try_send(tap.clone()).err();
                if err.map(|e| e.is_disconnected()).unwrap_or(false) {
                    // 报错就干掉这个tap2_tx
                    self.svcs.swap_remove(idx);
                }
            }
            // 保存tap
            self.taps.push(tap);
            // 发送信号,通知grpc线程,tap已就绪
            let _ = ack.send(());
        }
        // 标记任务未完成,会放回队列等待下一次执行
        Ok(Async::NotReady)

这段逻辑主要将grpc那边来的tap送到layer,从而将前面的layer和grpc部分的逻辑串了起来。

`tap_layer`

layer相关逻辑主要在初始化和后续实际处理请求那。其创建会用到刚才生成的Register的实例,并用于之后的Stack::call(见linkerd2-proxy/linkerd/app/core/src/tap/service.rs:96)中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        let inspect = target.clone();
        let inner = self.inner.call(target);
        let tap_rx = self.registry.register();
        MakeFuture {
            inner,
            next: Some((tap_rx, inspect)),
        }

registry.register()中(见linkerd2-proxy/linkerd/app/core/src/tap/daemon.rs:148):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        // 再创建一个通道,将其命名为:tap2_tx, tap2_rx
        let (tx, rx) = mpsc::channel(super::TAP_CAPACITY);
        // 将tap2_tx塞入最开始的svc_tx
        if let Err(_) = self.0.try_send(tx) {
            debug!("failed to register service");
        }
        rx

在后续生成的Service中,首先看poll_ready(见linkerd2-proxy/linkerd/app/core/src/tap/service.rs:150):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        // 此处的tap_rx实际上是tap2_rx.
        // 从该通道取出所有tap,存到self.taps
        while let Ok(Async::Ready(Some(t))) = self.tap_rx.poll() {
            self.taps.push(t);
        }
        // 只保留还需要继续tap的对象
        self.taps.retain(|t| t.can_tap_more());

        self.inner.poll_ready()

接着是call(见linkerd2-proxy/linkerd/app/core/src/tap/service.rs:161):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        let mut req_taps = Vec::new();
        let mut rsp_taps = Vec::new();

        for t in &mut self.taps {
            // 对req调用Tap::tap接口,获取请求信息,并生成TapRequestPayload结构和TapResponse结构
            if let Some((req_tap, rsp_tap)) = t.tap(&req, &self.inspect) {
                req_taps.push(req_tap);
                rsp_taps.push(rsp_tap);
            }
        }

        // 将tap请求与原始req请求体合为Payload对象,并替代原始请求体
        // 在后续从请求体中获取数据时,调用tap的接口(data/eos/fail)对请求数据进行处理
        let req = req.map(move |inner| Payload {
            inner,
            taps: req_taps,
        });

        let inner = self.inner.call(req);

        ResponseFuture {
            inner,
            taps: rsp_taps,
        }

ResponseFuture::poll中(见linkerd2-proxy/linkerd/app/core/src/tap/service.rs:200):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        // 实际服务回复的future,调用poll拿到实际response
        match self.inner.poll() {
            Ok(Async::NotReady) => Ok(Async::NotReady),
            Ok(Async::Ready(rsp)) => {
                // 对response调用TapResponse::tap获取信息
                let taps = self.taps.drain(..).map(|t| t.tap(&rsp)).collect();
                let rsp = rsp.map(move |inner| {
                    let mut body = Payload { inner, taps };
                    if body.is_end_stream() {
                        body.eos(None);
                    }
                    body
                });
                Ok(Async::Ready(rsp))
            }
            Err(e) => {
                for tap in self.taps.drain(..) {
                    tap.fail(&e);
                }
                Err(e)
            }
        }

前面这些逻辑,其中出现了2个tap接口,一个是Tap::tap,一个是TapResponse::tap,这俩的核心作用都是从请求或回复数据中获取需要的tap信息,然后发往某个通道,细节下面再讲。

`tap_grpc`

tap_grpcServer::new(subscribe)生成,实现了api::server::Tap这个grpc server,响应observe这个method请求。该请求来自Linkerd2的tap组件。

收到请求后:

  1. 解析请求参数:limit match extract
  2. 生成一个唯一idbase_id
  3. 创建一个用于传递api::TapEvent事件的通道,用其发送端events_tx构造一个Tap对象
  4. 调用subscribe.subscribe(tap),得到一个SubscribeFuture任务
  5. 构造任务ResponseFuture

在任务ResponseFuturepoll中,会先执行SubscribeFuture::poll(见linkerd2-proxy/linkerd/app/core/src/tap/daemon.rs:178):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        loop {
            self.0 = match self.0 {
                FutState::Subscribe {
                    ref mut tap,
                    ref mut tap_tx,
                } => {
                    // 此处的 tap_tx 即为最开始创建的tap通道发送端,待其就绪后再往下走
                    try_ready!(tap_tx.poll_ready().map_err(|_| super::iface::NoCapacity));

                    // tap为上面步骤3处构造
                    let tap = tap.take().expect("tap must be set");
                    // 构造一个一次性通道
                    let (tx, rx) = oneshot::channel();
                    // 将其发送端与tap打包发送到tap通道
                    tap_tx
                        .try_send((tap, tx))
                        .map_err(|_| super::iface::NoCapacity)?;

                    FutState::Pending(rx)
                }
                FutState::Pending(ref mut rx) => {
                    // 从接收端获取到信号,表示所依赖任务执行完毕
                    return rx.poll().map_err(|_| super::iface::NoCapacity);
                }
            }
        }

SubscribeFuture::poll执行完毕,会接着构造一个ResponseStream流,并包装成grpc结果返回。

ResponseStream::poll中(见linkerd2-proxy/linkerd/app/core/src/tap/grpc/server.rs:225):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        // 限制判断
        self.shared = self.shared.take().and_then(|shared| {
            if shared.is_under_limit() {
                Some(shared)
            } else {
                None
            }
        });

        // 从事件通道获取事件并返回给stream流,发给grpc客户端,即tap组件
        self.events_rx.poll().or_else(|_| Ok(None.into()))

由此看出,每个grpc请求会对应着一个Tap对象,往Tap.shard.events_tx中发送事件,则该事件会最终发到grpc请求方。

Tap::tap(见linkerd2-proxy/linkerd/app/core/src/tap/grpc/server.rs:267):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        let shared = self.shared.upgrade()?;
        // 判断是否需要tap
        if !shared.match_.matches(req, inspect) {
            return None;
        }

        // 省略若干从req中提取事件信息...

        // tap事件
        let event = api::TapEvent {
            event: Some(api::tap_event::Event::Http(api::tap_event::Http {
                event: Some(api::tap_event::http::Event::RequestInit(init)),
            })),
            ..base_event.clone()
        };

        // 发送事件
        let mut events_tx = shared.events_tx.clone();
        events_tx.try_send(event).ok()?;

        let tap = TapTx { id, tx: events_tx };

        let req = TapRequestPayload {
            tap: tap.clone(),
            base_event: base_event.clone(),
        };
        let rsp = TapResponse {
            tap,
            base_event,
            request_init_at,
            extract_headers,
        };
        Some((req, rsp))

图示

proxy-tap

总结

至此,以上3个不同的角色互相合作,实现了:

  1. Linkerd2的tap组件下发tap请求
  2. proxy向所有流量请求中插入tap请求
  3. 抓取到tap数据后,上报至Linkerd2的tap组件

文章转载自ServiceMesher。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CNCF 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
从空间解析转录组学推断等位基因特异性拷贝数畸变和肿瘤系统图谱
追风少年i
2024/11/04
1530
从空间解析转录组学推断等位基因特异性拷贝数畸变和肿瘤系统图谱
算法开发 | 从空间解析转录组学推断等位基因特异性拷贝数异常和肿瘤系统地理学
生信菜鸟团
2024/12/20
2130
算法开发 | 从空间解析转录组学推断等位基因特异性拷贝数异常和肿瘤系统地理学
课前准备----高通量单细胞分析数据集中的体细胞突变检测
体细胞突变在单细胞分辨率上的表征对于研究癌症进化、克隆嵌合和细胞可塑性至关重要。 体细胞突变在单细胞分辨率上的表征对于研究癌症中的遗传异质性和细胞可塑性、非肿瘤组织中的克隆嵌合体以及确定在恶性细胞和表型正常细胞中起作用的突变过程至关重要。单细胞基因组测序为研究单细胞突变提供了最直接的方法。 单细胞基因组测序的一种替代策略包括直接从高通量单细胞测定中检测测序reads中的体细胞突变,如scRNA-seq和scATAC-seq。这种方法的主要优点是可以利用单细胞分析的高通量来绘制细胞谱系的转录或调控程序,而不需要复杂的实验方案来联合分析来自同一细胞的DNA和RNA。然而,由于不同细胞类型的基因表达的可变性、等位基因脱落事件、RNA编辑、有限的覆盖深度和测序产物,突变的检测受到很大限制。因此,现有的算法依赖于检测突变,如单核苷酸变异(SNV)或indel,这些突变以前是通过匹配的bulk或单细胞DNA测序数据确定的。
追风少年i
2024/09/08
1650
课前准备----高通量单细胞分析数据集中的体细胞突变检测
你的单细胞数据集还可以分析体细胞突变
单细胞水平上的体细胞突变特征对于研究癌症进化、克隆镶嵌和细胞可塑性至关重要。传统的单细胞基因组测序方法在可扩展性和基因组丢失率方面存在挑战。另一策略是从scRNA-seq 和 scATAC-seq 检测体细胞突变,这种方法的主要优点是可以将细胞谱系映射到转录或调控程序,但由于不同细胞类型的基因表达差异、等位基因脱落事件、RNA 编辑、有限的覆盖深度和测序伪影,突变的检测受到严重限制。因此,现有算法检测体细胞突变具有局限性。因此,研究团队开发了一种名为SComatic的算法,旨在直接检测 scRNA-seq 和ATAC-seq(可及染色质序列测定)数据集中的体细胞突变,而无需匹配的大量或单细胞DNA测序数据。
生信菜鸟团
2024/07/31
4990
你的单细胞数据集还可以分析体细胞突变
Nat. Methods | 新算法利用空间转录组数据构建肿瘤的“空间进化图谱”
癌症的进展由体细胞突变和染色质重塑共同驱动,包括核苷酸变异(SNV)、体细胞拷贝数变异(CNA)和大规模结构变异等。对批量肿瘤或分离单细胞中的体细胞突变进行测序可揭示肿瘤内部的遗传异质性,并能重建肿瘤的进化史;肿瘤之间也表现出异质性,并能够在物理空间内发生进展。分析肿瘤在时间和空间上的体细胞进化是癌症研究中的一个关键挑战,常因缺乏空间数据而受阻。
DrugAI
2024/11/23
1600
Nat. Methods | 新算法利用空间转录组数据构建肿瘤的“空间进化图谱”
你真的理解体细胞突变吗?
在测序早期,由于该过程高强度的劳动仅测序了少量的碱基。在动物模型和细胞系中,人们确定了一些在肿瘤发病机理中起着重要作用的基因。随后,研究人员在患者样本中分析了这些突变并评估了它们对预后效果的影响。例如:TP53在各种癌症中普遍发生了突变,NPM1是现在急性髓细胞白血病最常分析的基因之一,该突变定义了当前世界卫生组织分类中的急性髓细胞性白血病亚型。
生信技能树
2020/09/29
5K0
你真的理解体细胞突变吗?
【生信文献200篇】21 使用单细胞多组学探索TNBC病人的新辅助化疗疗效
英文标题:Chemoresistance Evolution in Triple-Negative Breast Cancer Delineated by Single-Cell Sequencing
生信菜鸟团
2021/03/23
1.6K0
肿瘤多区域取样的进化分析五:追踪非小细胞肺癌的进展
Tracking the Evolution of Non–Small-Cell Lung Cancer
作图丫
2022/03/29
7130
肿瘤多区域取样的进化分析五:追踪非小细胞肺癌的进展
现在发在NG上的癌症全面基因组分析跟几年前的有什么不同?
生信菜鸟团
2025/02/18
1590
现在发在NG上的癌症全面基因组分析跟几年前的有什么不同?
10X单细胞空间数据分析之SNP检测篇
Cellsnp-lite是在C/ c++中实现的,并执行每个细胞基因分型,supporting both with (mode 1) and without (mode 2) given SNPs。在后一种情况下,杂合snp将被自动检测。Cellsnp-lite适用于基于液滴的(例如10XGenomics数据)和well-based的平台(例如SMART-seq2数据)。
追风少年i
2023/04/29
9430
10X单细胞空间数据分析之SNP检测篇
单细胞水平的肿瘤拷贝数分析新方法
它提出来了 single-cell inferred chromosomal copy number variation (sciCNV), a tool for inferring single-cell CNVs from scRNA-seq at 19-46 Mb resolution.
生信技能树jimmy
2023/08/31
4790
单细胞水平的肿瘤拷贝数分析新方法
课前准备---为什么CNV在单细胞空间数据上可以检测肿瘤细胞?
追风少年i
2025/07/03
1150
课前准备---为什么CNV在单细胞空间数据上可以检测肿瘤细胞?
肿瘤化疗无效是对预先存在的突变的选择还是诱发新突变,Cell给你答案
三阴乳腺癌(TNBC)是乳腺癌的一种侵袭性亚型,是指雌激素受体(ER),孕激素受体(PR)和原癌基因(HER-2)均为阴性的乳腺癌,常对化疗产生耐药性。而耐药性的产生到底是之前存在的稀有突变细胞受到选择还是新基因突变导致的,仍是一个谜团。 为研究该问题,Charissa Kim等人利用混合细胞外显子测序以及单细胞DNA和RNA测序,对新辅助化疗(NAC)期间20名TNBC患者进行跟踪分析。深度外显子组测序结果显示10例病人化疗后原始突变消失,清除了所有肿瘤细胞;10例病人化疗后突变依然存在。对其中8位患者(
生信宝典
2018/06/26
8940
这篇发在Nature上的泛癌RNA alterations能给我们带来哪些思考?
今天跟大家分享的是2020年2月发表在Nature(IF:43.07)杂志上的一篇文章“Genomic basis for RNA alterations in cancer”.在文章中研究者们提出了一个跨越27种不同的肿瘤类型的全面的RNA水平变化目录,在基因组背景下,这种RNA改变为鉴定与癌症相关的功能基因和机制提供了丰富的资源。
生信菜鸟团
2020/08/04
1.3K0
这篇发在Nature上的泛癌RNA alterations能给我们带来哪些思考?
Nature | SMath:从19个非患病组织部位的150名捐献者中生成体细胞变异参考目录
◉ a,遗传变异、早期体细胞突变和晚期体细胞突变之间的示意图比较。◉ b,体细胞突变的原因及类型概览。EN,核酸内切酶;ME,可移动元件;ORF,开放阅读框;RT,逆转录酶;ssDNA,单链DNA。◉ c,不同发育阶段和组织中报道的体细胞单核苷酸变异(SNV)突变率概览。第一次细胞分裂的数据6,7,59 和后续细胞分裂的数据6,7,59 为每次细胞分裂每细胞的SNV数目。◉ 早期中枢神经系统(CNS)9 和胎盘62 的胎儿发育数据为每天每细胞的SNV数目。◉ 成年阶段的数据以每年为单位,估算对象包括生精小管48、造血干细胞26,52,144、B淋巴细胞52、神经元63,145、T淋巴细胞52、支气管上皮53、胃上皮146、子宫内膜上皮79、肝细胞19、小肠上皮19,115、结直肠上皮19,24,29 以及心肌细胞49。◉ ZGA,合子基因组激活。
生信菜鸟团
2025/07/04
1840
Nature | SMath:从19个非患病组织部位的150名捐献者中生成体细胞变异参考目录
10X单细胞、空间、WES测序分析揭示肿瘤微环境进化区域异质性
结直肠癌(CRC)进展的遗传模型定义了驱动人类结肠上皮发育不良和恶性肿瘤的突变事件的累积序列。这种传统的腺瘤-癌轨迹涉及驱动基因APC、KRAS和TP53的改变,导致染色体不稳定(CIN)。另外,来自所谓的serrated pathway的sporadic CRC的一个subset更可能是BRAF驱动的微卫星不稳定(MSI-H),主要是由于MLH1的双等位基因高甲基化,导致高突变。几十年来的研究已经产生了更多的CRC亚型,阐明了侵袭和转移的替代途径,以及恶性病变前的特征及其临床预后。最近,单细胞和空间分子分析的出现以高分辨率揭示了不同程度的肿瘤内异质性,这表明先前提出的沿常规或锯齿状途径的线性肿瘤进展不能完全解释全球癌症相关死亡的第二大原因的进化动力学。此外,来自空间分辨分析的分层分子信息可用于建立与基因和蛋白质表达或细胞“状态”相关的模型,以跨肿瘤区域的克隆身份。以这种方式对肿瘤系统地理学进行探索,可以在考虑区域异质性的同时,对进化关系进行更深入的分析。
追风少年i
2024/02/14
4230
10X单细胞、空间、WES测序分析揭示肿瘤微环境进化区域异质性
肿瘤多区域取样的进化分析六:复发的神经母细胞瘤表现频繁的RAS-MAPK通路突变
神经母细胞瘤是一种外周交感神经系统的小儿肿瘤。肿瘤的表现从自发退化到无法治愈的进展不等。尽管有广泛的治疗,如化疗、手术、放射治疗和免疫治疗,高风险神经母细胞瘤患者的存活率仍低于50%。在大多数患者中,可以观察到对治疗的初步反应,然而,这些患者中高达60%的患者随后复发,并伴有难治性肿瘤。一些遗传变异,包括MYCN扩增和染色体节段性改变,如1p缺失、11q缺失或17q扩增,与预后不良有关。然而,尚不清楚哪些遗传缺陷与疾病复发有关。
作图丫
2022/03/29
6720
肿瘤多区域取样的进化分析六:复发的神经母细胞瘤表现频繁的RAS-MAPK通路突变
Nature:分析2658例癌症样本的全基因组中非编码体细胞的driver
以往的大规模测序项目已经确定了许多公认的癌症基因,但大部分工作都集中在蛋白质编码基因的突变和拷贝数改变上,主要使用全外显子组测序和单核苷酸多态性阵列数据。全基因组测序使系统地调查非编码区域的潜在driver事件成为可能,包括单核苷酸变异(SNVs),小的插入和缺失(indels)和更大的结构变异。全基因组测序能够精确定位结构变异断点(breakpoints)和不同基因组位点之间的连接( juxtapositions并置)。虽然以前的小规模样本的全基因组测序分析已经揭示了候选的非编码调控driver事件,但这些事件的频率和功能含义仍然缺乏研究。
作图丫
2022/03/29
8320
Nature:分析2658例癌症样本的全基因组中非编码体细胞的driver
Bulk WES 和单细胞DNA测序重建肿瘤突变谱系
三阴性乳腺癌经常进展为转移性疾病,导致生存率较差,过去的研究表明其存在广泛的瘤内异质性ITH,对化疗产生耐药性。而单细胞基因组测序 scDNA-seq 是研究 ITH 的一种重要方法,过去在方法进行 WGS 可以用于拷贝数变异分析,但是对于突变分析需要较高的测序深度。因此作者认为应该进行单细胞基因组区域测序(外显子或靶向),并开发出来 MPT-scDNAseq方法。该方法结合了批量 DNA 测序、基于单细胞液滴的微流体和定制的靶向面板。
生信菜鸟团
2024/03/25
3900
Bulk WES 和单细胞DNA测序重建肿瘤突变谱系
读书笔记 | 癌症计算系统生物学 | 第 03 章 实验性高通量癌症研究技术
第 2 章 描述了当正常细胞转化为癌细胞时,在不同分子水平上发生的一系列失调现象。突变(mutations)的逐步累积以及在肿瘤进展(tumour progression)过程中发生的事件会在以下各个层次上扰乱细胞的正常行为(参见图 3.1):
生信菜鸟团
2024/11/23
2010
读书笔记 | 癌症计算系统生物学 | 第 03 章 实验性高通量癌症研究技术
推荐阅读
从空间解析转录组学推断等位基因特异性拷贝数畸变和肿瘤系统图谱
1530
算法开发 | 从空间解析转录组学推断等位基因特异性拷贝数异常和肿瘤系统地理学
2130
课前准备----高通量单细胞分析数据集中的体细胞突变检测
1650
你的单细胞数据集还可以分析体细胞突变
4990
Nat. Methods | 新算法利用空间转录组数据构建肿瘤的“空间进化图谱”
1600
你真的理解体细胞突变吗?
5K0
【生信文献200篇】21 使用单细胞多组学探索TNBC病人的新辅助化疗疗效
1.6K0
肿瘤多区域取样的进化分析五:追踪非小细胞肺癌的进展
7130
现在发在NG上的癌症全面基因组分析跟几年前的有什么不同?
1590
10X单细胞空间数据分析之SNP检测篇
9430
单细胞水平的肿瘤拷贝数分析新方法
4790
课前准备---为什么CNV在单细胞空间数据上可以检测肿瘤细胞?
1150
肿瘤化疗无效是对预先存在的突变的选择还是诱发新突变,Cell给你答案
8940
这篇发在Nature上的泛癌RNA alterations能给我们带来哪些思考?
1.3K0
Nature | SMath:从19个非患病组织部位的150名捐献者中生成体细胞变异参考目录
1840
10X单细胞、空间、WES测序分析揭示肿瘤微环境进化区域异质性
4230
肿瘤多区域取样的进化分析六:复发的神经母细胞瘤表现频繁的RAS-MAPK通路突变
6720
Nature:分析2658例癌症样本的全基因组中非编码体细胞的driver
8320
Bulk WES 和单细胞DNA测序重建肿瘤突变谱系
3900
读书笔记 | 癌症计算系统生物学 | 第 03 章 实验性高通量癌症研究技术
2010
相关推荐
从空间解析转录组学推断等位基因特异性拷贝数畸变和肿瘤系统图谱
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档